__FILE__
and __LINE__
are sort of dynamic constants that hold the file and line that are currently executing. Passing them in here allow errors to properly report their location.
instance_eval <<-end_eval, __FILE__, __LINE__
def foo
a = 123
b = :abc
a.send b
end
end_eval
foo
When you run this
$ 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
Note it says the file and line #5 even though that was just text in an eval. Without those the file/line trick the output would look like this:
$ ruby foo.rb
(eval):5:in `send': undefined method `abc' for 123:Fixnum (NoMethodError)
from (eval):5:in `foo'
from foo.rb:11
The stack trace simply shows (eval)
which isn't as helpful.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…