I tried this, and was surprised to find that 1.8.7 makes a special case
of eval inside an instance method of Binding:
Right. I thought that was idea because you want to know about the
binding, not the instance of Binding.
$ irb --simple-prompt>> RUBY_VERSION
=> "1.8.7"
>> RUBY_PATCHLEVEL
=> 174
>> class Binding; def __LINE__; eval "__LINE__"; end; end
=> nil
>> class Binding; def __FILE__; eval "__FILE__"; end; end
=> nil
>> binding.__LINE__
=> 6
>> binding.__LINE__
=> 7
>> binding.__FILE__
=> "(irb)"
>> binding.__FILE__
=> "(irb)"
This is particularly surprising given that instance_eval doesn't show
this behaviour:
>> binding.instance_eval "__LINE__"
=> 1
>> binding.instance_eval "__LINE__"
=> 1
>> binding.instance_eval "__FILE__"
=> "(eval)"
>> binding.instance_eval "__FILE__"
=> "(eval)"
__FILE__ is the filename where the source being executed is found. When
eval'ing from a string, the source is not in any particular file and so
I'd always expect "(eval)" to be returned, and __LINE__ to be relative
to the start of the string, unless you pass file and/or line numbers as
extra args to eval.
In ruby 1.9.2 this works as I'd expect:
$ irb19 --simple-prompt>> RUBY_REVISION
=> 24186
>> class Binding; def __LINE__; eval "__LINE__"; end; end
=> nil
>> class Binding; def __FILE__; eval "__FILE__"; end; end
=> nil
>> binding.__LINE__
=> 1
>> binding.__LINE__
=> 1
>> binding.__FILE__
=> "(eval)"
>> binding.__FILE__
=> "(eval)"
So I'd say that 1.8.7 is the anomoly.
In that case there would be no way to define these manually. And I
would need to request that Binding support __LINE__ and __FILE__ in
core.
But I'm not so sure, because there has to be a way to access the
binding itself or what is the point? Perhaps Binding needs a special
method, ie. #binding_eval, which would eval as if in the binding.
···
On Feb 22, 11:46 am, Brian Candler <b.cand...@pobox.com> wrote: