tutorial - ruby wikipedia




Ruby alcance de DATA despues de__END__ (2)

Estoy usando este truco de Ruby con __END__ y DATA para poner algunos datos dentro de mi archivo de programa:

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

Esto genera la siguiente salida:

"test"
""

Supuse que los DATA serían los mismos a nivel mundial, pero dentro de la clase no tiene contenido. ¿Cómo obtendría acceso a los datos después de __END__ dentro de una clase (aparte de la solución obvia y fea que usa variables globales)?

AÑADIDO: veo que leer los DATA dos veces no me da nada la segunda vez. Podría usar rewind para volver al inicio, pero read luego me da el código fuente completo de mi programa. ¿Hay una manera más fácil de llegar a la parte después de __END__ en los usos posteriores de los DATA , o sería mejor leerla una vez y almacenarla en otro lugar para usarla en el futuro?


DATOS es el mismo. Obtendrías la misma salida si en lugar de hacer Foo.new harías DATA.read una segunda vez.

Esto se debe a que, después de que la primera lectura de DATA (que es un IO) haya llegado al final de la secuencia, todas las lecturas posteriores devolverán una cadena vacía, a menos que agregue datos adicionales a DATOS o regrese DATA al comienzo de la secuencia.

Edición: para volver al punto justo después de __END__ , debe leer DATA.pos antes de realizar cualquier lectura en DATA y luego restaurar la pos a ese valor después de leer. La solución más fácil probablemente es hacer FOO = DATA.read al principio del script y luego usar FOO .


rebobina los DATOS primero, porque es una transmisión.

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






ruby