>> Maybe it has something to do with method_missing. I suspect object es 
>> has a private method #y which requires one argument. This is the one 
>> es.send(:y) calls (as it can call private methods). However when you 
>> call the method as just es.y, it is not found and method_missing is 
>> called which happens to handle y as a method with no arguments.

Wow Peter, nice one to figure that out!

> Ah yes!!! That seems to be the case.
> 
> It also seems to be a reasonable workaround for me.
> 
>  >> es.send(:method_missing,:y)
> => 30.468257171342
>  >>
-------------------------------------------
class A
   def b
     puts "this is b!"
   end
   private :b
	
   def method_missing name
     puts "this is method missing: #{name}"
   end
end

a = A.new

a.b
a.send(:b)
eval "a.#{:b.to_s}"
-------------------------------------------
output:

this is method missing: b
this is b!
this is method missing: b

-------------------------------------------

I would resort to eval in this case, rather than relying
on implementation details. (but its slower, for sure)

cheers

Simon