Robert Klemme
1/11/2005 8:17:00 AM
"David A. Black" <dblack@wobblini.net> schrieb im Newsbeitrag
news:Pine.LNX.4.61.0501101703450.10841@wobblini...
> Hi --
>
> On Tue, 11 Jan 2005, itsme213 wrote:
>
> >
> > "David A. Black" <dblack@wobblini.net> wrote
> >
> >> rather than simply
> >> asking an object to do something at the moment you want it to do that
> >> thing, you're introducing a wrapper/notation mechanism
> >
> > Not always true. Below I've dropped many of the ':' as I think they
are not
> > syntactically essential.
> >
> > [x,y] = obj
> > is the same as
> > x = obj[0]
> > y = obj[1]
> > So I ask obj to 'do' its [0], [1] right where I want it. Variables are
bound
> > to results.
>
> Hmmm...
>
> irb(main):004:0> obj = [1,2]
> => [1, 2]
> irb(main):005:0> [x,y] = obj
> SyntaxError: compile error
>
> Or did you mean: x,y = obj ? I don't think I'd characterize it as obj
> "doing its [0], [1]". You're not sending messages to obj -- not even
> the message #[]. What happens in this scenario depends on assignment
> semantics, not message semantics.
I'd say methods are invoked:
class Foo
include Enumerable
def initialize(x) @x=x end
def each(&b) p "EACH"; @x.times(&b) end
def to_a() p "TO_A"; super end
end
>> f = Foo.new 5
=> #<Foo:0x1016f950 @x=5>
>> a,b,c = *f
"TO_A"
"EACH"
=> [0, 1, 2, 3, 4]
>> a
=> 0
>> b
=> 1
>> c
=> 2
Now I'm making things more complicated: generic Enumerables and Arrays are
treated differently in this assignment context:
>> a,b,c = [0,1,2,3,4]
=> [0, 1, 2, 3, 4]
>> a
=> 0
>> b
=> 1
>> c
=> 2
>> a,b,c = *[0,1,2,3,4]
=> [0, 1, 2, 3, 4]
>> a
=> 0
>> b
=> 1
>> c
=> 2
>> a,b,c = f
=> [#<Foo:0x1016f950 @x=5>]
>> a
=> #<Foo:0x1016f950 @x=5>
>> b
=> nil
>> c
=> nil
>> a,b,c = *f
"TO_A"
"EACH"
=> [0, 1, 2, 3, 4]
>> a
=> 0
>> b
=> 1
>> c
=> 2
For arrays the star is added implicitely while for generic enumerables
it's not. That's might be a reason to do away with this implicit
behavior - at least for me.
(In Ruby 1.8.1 that is)
Kind regards
robert