2009-08-26 5 views
15

sto usando questo trucco rubino con __END__ e DATA di mettere alcuni dati all'interno del mio file di programma:Rubino portata dei dati dopo __END__

class Foo 
    def initialize() 
    puts DATA.read.inspect 
    end 
end 
puts DATA.read.inspect 
Foo.new 
__END__ 
test 

Questo genera il seguente output:

"test" 
"" 

I aveva assunto DATA sarebbe lo stesso a livello globale, ma all'interno della classe non ha contenuto. Come potrei accedere ai dati dopo __END__ all'interno di una classe (a parte la soluzione ovvia e brutta che utilizza le variabili globali)?

AGGIUNTO: Vedo come la lettura di DATA due volte non mi dia nulla la seconda volta. Potrei usare rewind per tornare all'inizio, ma read quindi mi fornisce l'intero codice sorgente del mio programma. C'è un modo più semplice per ottenere la parte dopo __END__ per gli usi successivi di DATA, o sarebbe meglio leggerlo una volta e archiviarlo da qualche altra parte per un uso futuro?

risposta

20

I dati sono gli stessi. Si otterrebbe lo stesso risultato se invece di fare Foo. Nuovo si farebbe DATA.read una seconda volta.

Questo perché dopo la prima lettura DATA (che è un IO) ha raggiunto la fine del flusso, in modo che qualsiasi legge inoltre restituirà una stringa vuota, a meno che non si accoda dati aggiuntivi a dati o riavvolgere DATA all'inizio del il flusso.

Modifica: Per cercare di tornare al punto giusto dopo la __END__ devi leggere DATA.pos prima di eseguire qualsiasi lettura sulla DATA e quindi ripristinare pos a quel valore dopo la lettura. La soluzione più semplice è probabilmente solo fare all'inizio dello script e quindi utilizzare FOO.

+0

Fare 'FOO = DATA.read' perderà i vantaggi di un oggetto' IO' enumerabile. 'FOO = StringIO.new (DATA.read, 'r')' può essere preferibile? (È necessario 'require' stringio'' prima) – AlvaPan

-3

rewind DATI prima, perché è un flusso.

class Foo 
    def initialize() 
    DATA.rewind 
    puts DATA.read.inspect 
    end 
end 
puts DATA.read.inspect 
Foo.new 
__END__ 
test 
+1

Questo sembra darmi l'intero contenuto del file, non solo la parte dopo '__END__'. – avdgaag

Problemi correlati