__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