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.