__END__之后的Ruby范围的DATA

时间:2009-08-26 10:22:56

标签: ruby

我正在使用这个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之后的部分,或者我会更好地阅读它并将其存储在其他地方以备将来使用?

2 个答案:

答案 0 :(得分:22)

DATA是一样的。如果不是做Foo.new,你会得到相同的输出,你会第二次做DATA.read。

这是因为在第一次读取DATA(这是一个IO)到达流的末尾之后,所以任何进一步的读取都将返回一个空字符串,除非您将附加数据附加到DATA或倒带{{ 1}}到流的开头。

修改:要在DATA之前找回__END__之前的点DATA.pos,然后再对DATA执行任何阅读,然后将pos恢复为该值读。最简单的解决方案可能只是在脚本开头执行FOO = DATA.read,然后使用FOO

答案 1 :(得分:-4)

首先回放DATA,因为它是一个流。

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