Ruby eval 在 irb 和文件中的行为不同
这段代码在 irb 中工作:
irb(main):037:0> eval <<-EOS
irb(main):038:0" #{attribute} = "host"
irb(main):039:0" puts machine
irb(main):040:0" EOS
host
=> nil
irb(main):041:0> puts machine
host
=> nil
irb(main):042:0> puts attribute
machine
=> nil
irb(main):043:0>
但是当我尝试执行与 ruby 脚本相同的代码时,我收到以下错误:
../autosys/convert_jil_to_zapp.rb:40: undefined local variable or method `machine' for main:Object (NameError)
from ../autosys/convert_jil_to_zapp.rb:29:in `each_line'
from ../autosys/convert_jil_to_zapp.rb:29
from ../autosys/convert_jil_to_zapp.rb:27:in `each'
from ../autosys/convert_jil_to_zapp.rb:27
pi929c1n10 /ms/user/h/hirscst/ruby/autosys 77$ gvim try.rb
pi929c1n10 /ms/user/h/hirscst/ruby/autosys 78$ chmod +x try.rb
pi929c1n10 /ms/user/h/hirscst/ruby/autosys 79$ ./try.rb
host
./try.rb:8: undefined local variable or method `machine' for main:Object (NameError)
任何人都可以解释为什么吗?
This code works in irb:
irb(main):037:0> eval <<-EOS
irb(main):038:0" #{attribute} = "host"
irb(main):039:0" puts machine
irb(main):040:0" EOS
host
=> nil
irb(main):041:0> puts machine
host
=> nil
irb(main):042:0> puts attribute
machine
=> nil
irb(main):043:0>
however when I try to execute the same code as a ruby script I get the following error:
../autosys/convert_jil_to_zapp.rb:40: undefined local variable or method `machine' for main:Object (NameError)
from ../autosys/convert_jil_to_zapp.rb:29:in `each_line'
from ../autosys/convert_jil_to_zapp.rb:29
from ../autosys/convert_jil_to_zapp.rb:27:in `each'
from ../autosys/convert_jil_to_zapp.rb:27
pi929c1n10 /ms/user/h/hirscst/ruby/autosys 77$ gvim try.rb
pi929c1n10 /ms/user/h/hirscst/ruby/autosys 78$ chmod +x try.rb
pi929c1n10 /ms/user/h/hirscst/ruby/autosys 79$ ./try.rb
host
./try.rb:8: undefined local variable or method `machine' for main:Object (NameError)
can anyone explain why?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这是因为运行
eval
时尚未定义machine
变量。 更简洁的示例:在 IRB 中工作,但不作为脚本
在 IRB 中工作并作为脚本
到 引用 Matz:
不同之处在于,在 IRB 中,一切都会被评估,因此它们都在同一范围内。 也就是说,您实际上是在 IRB 中执行此操作:
它既可以在 IRB 中工作,也可以作为脚本工作。
It's because the
machine
variable was not already defined wheneval
was run. A more concise example:Works in IRB but not as a script
Works in IRB and as a script
To quote Matz:
The difference is that in IRB everything is being eval'd, so it's all in the same scope. That is, you're essentially doing this in IRB:
Which works both in IRB and as a script.
因为您是在 IRB 中而不是在 Ruby 脚本中定义名为
machine
的方法或变量。Because you're defining a method or variable named
machine
in IRB but not in your Ruby script.