gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 07:22:51 26 4
gpt4 key购买 nike

此代码在 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)

谁能解释一下为什么?

最佳答案

这是因为 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

收件人quote Matz :

local variables should be determined at compile time, thus local variables defined first in the eval'ed string, can only be accessed from other eval'ed strings. In addition, they will be more ephemeral in Ruby2, so that these variables will not be accessed from outside.

不同之处在于,在 IRB 中,一切 都被评估,所以它们都在同一个范围内。也就是说,您实际上是在 IRB 中执行此操作:

eval 'x = 3'
eval 'puts x'

既可在 IRB 中使用,也可作为脚本使用。

关于Ruby eval 在 irb 和文件中的行为不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/715010/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com