2016-05-20 28 views
5

Stavo leggendo sulla serializzazione di Ruby (http://www.skorks.com/2010/04/serializing-and-deserializing-objects-with-ruby/) e ho trovato il seguente codice. Cosa significa $? Presumo che $ si riferisca ad un oggetto?

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

Questo è brutto codice btw. Passare a ['IO.foreach'] (http://ruby-doc.org/core/IO.html#method-c-foreach) sarebbe un notevole miglioramento:' File.foreach ("/ home/alan/tmp/blah.yaml "," \ n \ n ") do | oggetto |'. Questo non usa (oscure) variabili globali e chiude anche il file. – cremno

+1

Questo non è un duplicato di [exemplar nominato] (http: // stackoverflow.it/questions/1042384/how-do-you-use-global-variables-or-constant-values-in-ruby): Quella domanda riguarda come usare le variabili globali in Ruby, ma questa domanda riguarda il significato di specifica variabile globale predefinita. –

risposta

7

$/ è una variabile predefinita. Viene utilizzato come separatore dei record di input e ha un valore predefinito di "\n".

Funzioni come gets utilizzano $/ per determinare come separare l'input. Per esempio:

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

Quindi, è necessario inserire INVIO due volte per terminare l'input per str.

Riferimento: Pre-defined variables

1

$ significa che è una variabile globale.

Questo è comunque speciale in quanto viene utilizzato da Ruby. Rubino utilizza tale variabile come un separatore di record di input

Per un elenco completo delle variabili globali particolari vedi: http://www.rubyist.net/~slagell/ruby/globalvars.html

0

Questo codice sta cercando di leggere ogni oggetto in un elemento di un array, quindi è necessario dire dove uno finisce e il prossimo inizia. La riga $/="\n\n" sta impostando ciò che Ruby usa per dividere il tuo file in.

$/ è noto come "separatore di record di input" ed è il valore utilizzato per suddividere il file durante la lettura. Per impostazione predefinita, questo valore è impostato su nuova riga, quindi quando si legge in un file, ogni la linea sarà messa in un array. Che impostazione di questo valore, stai dicendo rubino che una nuova linea non è la fine di una pausa, invece usa la stringa data.

Per esempio, se ho un file separato da virgole, posso scrivere $\="," poi se faccio qualcosa come il tuo codice su un file in questo modo:

foo, bar, magic, space 

vorrei creare direttamente un array, senza dover diviso ancora una volta:

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

Quindi la vostra linea cercherà due nuova linea, e divisa su ciascun gruppo invece che su ogni linea. Riceverai solo 2 nuove righe di fila quando una riga è vuota. Quindi questa riga dice ruby, quando si leggono i file, si rompono su linee vuote invece di ogni riga.