Я бы хотел использовать eval()
в Ruby 1.9 для интерактивного тестирования маленьких кусочков рубинового кода. Давным-давно (около Ruby 1.4) я нашел в интернете аккуратный скрипт, обеспечивающий эту функциональность. Вот упрощенная и сокращенная версия:
line = ''
$stdout.sync = true
print "ruby> "
while true
input = gets
if input
line = input
else
break if line == ''
end
begin
print eval(line).inspect, "\n"
rescue ScriptError, StandardError
$! = 'exception raised' unless $!
print "ERROR: ", $!, "\n"
end
break if not input
line = ''
print "ruby> "
end
Я смог сделать что-то вроде:
ruby> str = "a:b:c"
"a:b:c"
ruby> str.split /:/
["a", "b", "c"]
ruby>
Этот скрипт прекрасно работает до Ruby 1.8, но больше не в 1.9 из-за измененной семантики eval()
. Теперь я больше не могу создавать локальные переменные, такие как str
. Вместо этого я получаю следующее очевидное сообщение:
ERROR: undefined local variable or method `str' for main:Object
Есть ли способ исправить или обойти это поведение eval()
? Я читал кое-что о привязках, но я не уверен, как это сделать здесь.
Конечно, есть irb
, но в этом инструменте я не могу использовать знак фунта, как в "abc#{var}def"
. Если я попробую, то irb
закомментирует всю строку.