Brian Candler
3/10/2007 3:01:00 PM
On Sat, Mar 10, 2007 at 01:55:19PM +0900, Aaron Smith wrote:
> > It's the same in Ruby, except it goes further:
> >
> > int |= 0x10000000
> >
> > is short for
> >
> > int = int | 0x10000000
> >
> > is short for
> >
> > int = int.|(0x10000000) # infix operator is really method call on
> > LHS
> >
> > is short for
> >
> > int = int.send(:|, 0x10000000) # explicit method call by symbolic name
>
> pretty flippin cool.
>
> in this example:
> int = int.send(:|,0x1000000)
>
> is it neccessary to have assignment portion? as in:
> int.send(:|,0x1000000), does this take out the need for (int=)
You don't need to make use of the return value. Every expression in Ruby
returns a value, but you can simply ignore it.
In your particular example, if you write
int = 4
int.send(:|, 0x10000000)
it's valid Ruby but isn't very useful, as it calculates a result and then
throws it away. But many methods do have side effects:
str = "hello"
str.send(:concat, " world")
puts str
Actually you'd normally write the middle line as
str.concat(" world")
or
str.concat " world"
or
str << " world"
(since the << infix operator expands to a << method call on str, and for
Strings the << method does the same as concat)
This stems from the fact that a String in Ruby is a mutable object (it can
change). Most objects are. However a few objects, in particular numbers and
symbols, are immutable. That is, you can't send a message to the number 5
telling it to change its value :-)
Regards,
Brian.