Forum: Ruby Confusion with unary operator overidding

Posted by Kumar R. (kumar_r)
on 2013-03-09 15:07
I was trying to learn the operator over-ridding in Ruby. So i used the
below in my IRB.

>> class Banner < String
>> def +
?> upcase
>> end
>> def -
?> downcase
>> end
>> end
=> nil
>> ban = Banner.new("hi")
=> "hi"
>> +ban
NoMethodError: undefined method `+@' for "hi":Banner
        from (irb):22
        from C:/Ruby193/bin/irb:12:in `<main>'

Now after seeing the error in the `IRB` i corrected definition of `+`
and `-` as below, which in turn fixed the code.

>> class Banner < String
>> def +@
>> upcase
>> end
>> def -@
>> downcase
>> end
>> end
=> nil
>> ban = Banner.new("hi")
=> "hi"
>> +ban
=> "HI"

But my confusion is with the logical necessity of that `@` operator?

Again I tried to over-ride `!` as below:

>> class Banner
>> def !
>> reverse
>> end
>> end
=> nil
>> !ban
=> "ih"
>> not ban
=> "ih"

But here I didn't need to use that `@` operator.

Can anyone help me to understand why `@` was needed with `+` and `-` but
not with `!`?

Thanks
Posted by Mike Stok (Guest)
on 2013-03-09 15:48
(Received via mailing list)
+ and - can be both unary and binary operators, so there are differently 
named methods for the different operations. 
http://www.rubyinside.com/rubys-unary-operators-an... 
might be intresting to you .

Hope this helps,

Mike

On 2013-03-09, at 9:07 AM, "Kumar R." <lists@ruby-forum.com> wrote:

>>> end
>
> => "hi"
>>> end
> not with `!`?
>
> Thanks
>
> --
> Posted via http://www.ruby-forum.com/.

--

Mike Stok <mike@stok.ca>
http://www.stok.ca/~mike/

The "`Stok' disclaimers" apply.
Posted by Kumar R. (kumar_r)
on 2013-03-10 21:27
But my confusion is with the logical necessity of that `@` operator?
Posted by Hans Mackowiak (hanmac)
on 2013-03-10 21:34
there is no @ operator, its part of the method name TO DIFFERATE between
obj + obj2 and +obj

! does not have a method for obj ! obj2 so it does not need an @ at the 
unary name

same for methods that end with !, they only use that for this method 
names when there is a non-! method too like gsub has a gsub! partner, 
but replace is not called replace! because there is not an second method
Posted by Robert Klemme (robert_k78)
on 2013-03-10 22:24
(Received via mailing list)
On Sat, Mar 9, 2013 at 3:07 PM, Kumar R. <lists@ruby-forum.com> wrote:
> I was trying to learn the operator over-ridding in Ruby. So i used the
> below in my IRB.
>
>>> class Banner < String

Inheriting from String is a bad idea.  Really.

Cheers

robert
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.