我正在Practicing Ruby's Self-Guided Course on Stream, File Formats, and Sockets工作,并在pre-built test for the first exercise中遇到了以下问题。以下测试脚本应该将目录更改为项目文件夹的data
子目录:
eval(DATA.read) # load the test helper script
... # various calls to test method defined below
__END__
dir = File.dirname(__FILE__)
Dir.chdir("#{dir}/data")
...
但是这会中断,因为__FILE__
会返回(eval)
(而不是文件的路径)而File.dirname(__FILE__)
会返回.
为什么会发生这种情况,应该怎么写?而是产生预期的输出?
答案 0 :(得分:2)
__END__
和DATA
在这里并不相关。您只需将字符串传递给Kernel#eval
即可。例如,简单的eval('__FILE__')
也会返回"(eval)"
,因为它是默认的文件名。它可以通过传递另一个字符串来改变,但作为第三个参数:
eval('__FILE__', nil, 'hello.rb') # => "hello.rb"
或者在你的情况下:
eval(DATA.read, nil, __FILE__)