2016-05-20 23 views
5

Czytałem o serializacji Ruby (http://www.skorks.com/2010/04/serializing-and-deserializing-objects-with-ruby/) i natknąłem się na następujący kod. Co oznacza $/średnia? Zakładam, że $ odnosi się do obiektu?

array = [] 
$/="\n\n" 
File.open("/home/alan/tmp/blah.yaml", "r").each do |object| 
    array << YAML::load(object) 
end 
+1

To zły kod. Samo przejście na ['IO.foreach'] (http://ruby-doc.org/core/IO.html#method- c-foreach) byłoby dużym usprawnieniem:' File.foreach ("/ home/alan/tmp/blah.yaml "," \ n \ n ") do | object |'. To nie wykorzystuje (ukrywa) zmiennych globalnych, a także zamyka plik. – cremno

+1

To nie jest duplikat [nominowanego przykładu] (http: // stackoverflow.com/questions/1042384/how-do-you-use-global-variables-or-constant-in-ruby): To pytanie dotyczy tego, jak używać zmiennych globalnych w Ruby, ale to pytanie dotyczy znaczenia określona wcześniej zmienna globalna. –

Odpowiedz

7

$/ jest predefiniowaną zmienną. Jest używany jako separator rekordów wejściowych i ma domyślną wartość "\n".

Funkcje takie jak gets używają $/ do określenia sposobu oddzielenia wejścia. Na przykład:

$/="\n\n" 
str = gets 
puts str 

Więc trzeba wprowadzić dwukrotnieENTER, aby zakończyć wprowadzanie do str.

referencyjny: Pre-defined variables

1

$ oznacza, że ​​jest to zmienna globalna.

Ten jest jednak wyjątkowy, ponieważ jest używany przez Ruby. Ruby używa tej zmiennej jako separator rekordu wejściowego

do pełnej listy ze specjalnymi zmiennych globalnych zobacz: http://www.rubyist.net/~slagell/ruby/globalvars.html

0

Ten kod próbuje odczytać każdy obiekt do elementu tablicy, więc trzeba to powiedzieć, gdzie jeden kończy się, a następny zaczyna. Linia $/="\n\n" ustawia to, czego używa Ruby, aby rozbić twój plik.

$/ jest znany jako "separator rekordów wejściowych" i jest to wartość używana do podziału pliku podczas jego odczytu. Domyślnie ta wartość jest ustawiona na nową linię, więc gdy czytasz w pliku, każdy linia zostanie umieszczona w tablicy. Jakie ustawienie tej wartości, mówisz ruby, że jedna nowa linia nie jest końcem przerwy, zamiast tego użyj podanego ciągu.

Na przykład, jeśli mam pliku oddzielone przecinkami, mogę napisać $\="," wtedy, gdy robię coś takiego kodu w pliku jak poniżej:

foo, bar, magic, space 

Chciałbym utworzyć tablicę bezpośrednio, bez konieczności Podziel ponownie:

["foo", " bar", " magic", " space"] 

Twoja linia będzie więc wyglądała na dwie nowe linie i będzie dzielona na każdą grupę zamiast na każdą linię. Otrzymasz tylko 2 nowe wiersze z rzędu, gdy jeden wiersz jest pusty. Zatem ta linia mówi ruby, gdy czytając pliki, łamie puste linie zamiast każdej linii.