__END__之后的Ruby范围的DATA

avd*_*aag 16 ruby

我使用这个红宝石招用__END__,并DATA把我的程序文件里面的一些数据:

class Foo
  def initialize()
    puts DATA.read.inspect
  end
end
puts DATA.read.inspect
Foo.new
__END__
test
Run Code Online (Sandbox Code Playgroud)

这会生成以下输出:

"test"
""
Run Code Online (Sandbox Code Playgroud)

我假设DATA全局都是一样的,但在课堂上它没有内容.如何__END__在课堂内访问数据(除了使用全局变量的明显和丑陋的解决方案)?

补充:我看到DATA第二次阅读两次没有给我什么.我可以使用rewind回到开始,但read然后给我我的程序的完整源代码.__END__在后续使用之后是否有更简单的方法来获取该部分DATA,或者我是否会更好地阅读它并将其存储在其他地方以备将来使用?

sep*_*p2k 22

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

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

编辑:在执行任何__END__读取DATA.pos之前,在您必须阅读之后立即寻找该点DATA,然后pos在读取后恢复到该值.最简单的解决方案可能只是FOO = DATA.read在脚本开头然后使用FOO.