本文介绍了Ruby eval在irb和文件中的行为不同的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
此代码在irb中有效:
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>
但是,当我尝试执行与ruby脚本相同的代码时,出现以下错误:
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)
有人可以解释原因吗?
推荐答案
这是因为 eval 时,尚未定义> machine 变量。一个更简洁的示例:
It's because the machine
variable was not already defined when eval
was run. A more concise example:
eval 'x = 3'
puts x # throws an exception when run as a script
=> 3
在IRB中作为脚本工作
Works in IRB and as a script
x = 1
eval 'x = 3'
puts x
=> 3
致:
不同之处在于,在IRB中,所有内容都在评估中,因此它们都在同一范围内。也就是说,您实际上是在IRB中执行此操作:
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:
eval 'x = 3'
eval 'puts x'
在IRB和脚本中都可以工作。
Which works both in IRB and as a script.
这篇关于Ruby eval在irb和文件中的行为不同的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!