Mariusz Pekala
6/1/2007 2:44:00 PM
On 2007-06-01 22:39:23 +0900 (Fri, Jun), Vin Raja wrote:
> Hi All
> Another Query To bother you all:
>
> 1 class Person
> 2 def *(o)
> 3 puts "One person meets another"
> 4 end
> 5
> 6 def meets (o)
> 7 puts "One person meets another"
> 8 end
> 9 end
>
> 10 a= Person.new
> 11 b=Person.new
> 12
> 13 a * b
> 14 a.meets b
>
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> now with above Class the output is:
> >ruby yet.rb
> One person meets another
> One person meets another
>
> CASE 1
> If I replace Line 13 with this:
> a % b #(or any other operator i.e. $ ^ & et al.)
>
> I get the following error :
> yet.rb:16: undefined method `%' for #<Person:0x282dbf4> (NoMethodError)
>
> CASE 2
> But when i replaced Line 14 with this:
> a meets b
> the error was this
>
> >ruby yet.rb
> One person meets another
> yet.rb:17: warning: parenthesize argument(s) for future version
> yet.rb:17: undefined method `meets' for main:Object (NoMethodError)
>
> +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> THE QUERY
>
> If a method is encountered then what is order for locating the method
> in class hierarchy?
> I mean base to child or reverse?
Always in 'current' object, then in its parent and so on.
> And regardless of that order why ruby tries to locate the "%" method
> from Person (case 1)
>
> while the "meets" method is searched for in Object (case 2)
That's how hackers learn new languages! I like your style. :-)
You found the dark side of ruby parser.
In your case, the parser has decided that expression 'a meets b'
is a call to method 'Object#a' of 'self' (some 'main' object).
That's the cause of the warning 'parenthesize argument(s) for future
version'.
First step was to get the values of the parameter, which was 'meets b',
which got understood as a call to Object#meets with parameter 'b'.
The 'b' has been taken as a local variable, because of assignment in
line 11. Having the value of 'b' the call to Object#meets has been
executed, which generated the exception.
In the expression 'a % b' the '%' has been at once recognized as an
operator, so the corresponding method has been called on the left side
of that operator, thus the error - undefined method on Person.
In other words, the parser had decided that
'a % b' is:
'operator % with arguments "a" and "b"', which is equal to:
'a.%(b)'
and
in 'a meets b' meets is not an operator, so it's a function argument,
so 'a' is a method call, and there is no 'meets' variable (since there
was no assignment seen), so 'meets' is also a method call,
and it needs parentheses, so the result was:
'a( meets(b) )', which is:
'self.a( self.meets(b))', and self.class is Object.
--
No virus found in this outgoing message.
Checked by 'grep -i virus $MESSAGE'
Trust me.