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?
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.
Because you're defining a method or variable named
machine
in IRB but not in your Ruby script.