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