Это потому, что переменная 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, так и в виде скрипта.