Рубиновая область ДАННЫХ после __END__ - PullRequest
16 голосов
/ 26 августа 2009

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

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

Создает следующий вывод:

"test"
""

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

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

Ответы [ 2 ]

22 голосов
/ 26 августа 2009

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

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

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

0 голосов
/ 26 августа 2009

сначала перемотать данные, потому что это поток.

class Foo
  def initialize()
    DATA.rewind
    puts DATA.read.inspect
  end
end
puts DATA.read.inspect
Foo.new
__END__
test
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...