Область Ruby DATA после __END__

Я использую этот трюк Ruby с __END__ и DATA, чтобы поместить некоторые данные в файл моей программы:

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

Это генерирует следующий вывод:

"test"
""

Я предположил, что DATA будет одним и тем же глобально, но внутри класса он не имеет содержимого. Как получить доступ к данным после __END__ внутри класса (помимо очевидного и уродливого решения с использованием глобальных переменных)?

ADDED: Я вижу, как чтение DATA дважды не дает мне ничего второго. Я мог бы использовать rewind, чтобы вернуться к началу, но read затем дает мне весь исходный код моей программы. Есть ли более простой способ получить только часть после __END__ при последующем использовании DATA, или я бы лучше прочитал ее один раз и сохранил ее где-то еще для будущего использования?

Ответы

Ответ 1

ДАННЫЕ - то же самое. Вы получите тот же результат, если вместо Foo.new вы будете делать DATA.read второй раз.

Это происходит потому, что после первого чтения DATA (который является IO) достиг конца потока, поэтому любые последующие чтения возвращают пустую строку, если вы не добавите дополнительные данные в DATA или перемотаете DATA в начало потока.

Изменить: Чтобы вернуться к точке сразу после __END__, вы должны прочитать DATA.pos перед выполнением любых чтений на DATA, а затем восстановить pos до этого значения после прочтения. Самое простое решение, вероятно, просто выполняется FOO = DATA.read в начале script, а затем с помощью FOO.

Ответ 2

перемотайте DATA сначала, потому что это поток.

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