__FILE__
и __LINE__
являются своего рода динамическими константами, которые содержат файл и строку, которые выполняются в данный момент. Передача их здесь позволяет ошибкам правильно сообщать об их местонахождении.
instance_eval <<-end_eval, __FILE__, __LINE__
def foo
a = 123
b = :abc
a.send b
end
end_eval
foo
Когда вы запустите это
$ ruby foo.rb
foo.rb:5:in `send': undefined method `abc' for 123:Fixnum (NoMethodError)
from foo.rb:5:in `foo'
from foo.rb:11
Обратите внимание, что в нем говорится о файле и строке # 5, хотя это был просто текст в eval. Без этого трюка с файлом / строкой результат будет выглядеть так:
$ ruby foo.rb
(eval):5:in `send': undefined method `abc' for 123:Fixnum (NoMethodError)
from (eval):5:in `foo'
from foo.rb:11
Трассировка стека просто показывает (eval)
, что не так полезно.