当前位置:  开发笔记 > 后端 > 正文

Ruby eval在irb中与文件中的行为不同

如何解决《Rubyeval在irb中与文件中的行为不同》经验,为你挑选了1个好方法。

此代码适用于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)

有谁能解释为什么?



1> Jordan Broug..:

这是因为运行时尚machine未定义变量eval.一个更简洁的例子:

适用于IRB,但不适用于脚本

eval 'x = 3'
puts x # throws an exception when run as a script
=> 3

适用于IRB和脚本

x = 1
eval 'x = 3'
puts x
=> 3

要引用马茨:

局部变量应该在编译时确定,因此首先在eval'ed字符串中定义的局部变量只能从其他eval'ed字符串中访问.另外,它们在Ruby2中会更短暂,因此不会从外部访问这些变量.

不同之处在于IRB中的所有内容都被评估,因此它们都在相同的范围内.也就是说,你基本上是在IRB中这样做的:

eval 'x = 3'
eval 'puts x'

它既适用于IRB,也适用于脚本.

推荐阅读
mobiledu2402851203
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有