__END__之后的Ruby范围的DATA

我正在使用这个带有__END__DATA Ruby技巧将一些数据放入我的程序文件中:

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

这会生成以下输出:

 "test" "" 

我假设DATA在全球范围内是相同的,但在课堂内它没有内容。 如何在类中__END__之后访问数据(除了使用全局变量的明显和丑陋的解决方案)?

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

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

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

编辑:要在__END__之后__END__您必须在读取DATA.pos之前读取DATA.pos然后在读取后将pos恢复为该值。 最简单的解决方案可能只是在脚本开头做FOO = DATA.read然后使用FOO

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

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