On Feb 22, 11:46  䮮

> 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.