On Tue, 17 Oct 2000, [iso-8859-1] Aleksi Niemelwrote: > Hugh asks: [...] > > irb(main):002:0> *x > > SyntaxError: compile error > > irb(main):003:0> p *x > > [[2.3], 4, [5, 6]] > > nil > > > Not sure why *x didn't work there... > > Well, there's no such construct as plain *x. But there are constructs for > indexing (aref_args), multiple left hand side on assignment (mhls), multiple [...] > where the star symbol (tSTAR) have special meaning. (The names in > parentheses could be found from parse.y, if you want to check.) OK, I will have another look at that. > > So in above case *x does not parse, thus there's an error, but p *x parses, > as it means p(*x) and call_args rule parses *x. Namely *x in this context > takes an array of x and translates the elements to be arguments. That means > it concatenates the elements to the argument list, thus "removes" the > outmost level of array. So *x won't work because a list of arguments is not a full expression.... irb(main):001:0> def wossname(x) irb(main):002:1> x irb(main):003:1> end nil irb(main):004:0> x = [[[2.3], 4, [5, 6]]] [[[2.3], 4, [5, 6]]] irb(main):005:0> wossname(x) [[[2.3], 4, [5, 6]]] irb(main):006:0> wossname(*x) [[2.3], 4, [5, 6]] OK. That makes sense. So does this: irb(main):011:0> wossname(3,4,5) ArgumentError: wrong # of arguments(3 for 1) (irb):11:in `wossname' (irb):11:in `irb_binding' irb(main):012:0> wossname([3,4,5]) [3, 4, 5] irb(main):013:0> wossname(*[3,4,5]) ArgumentError: wrong # of arguments(3 for 1) (irb):13:in `wossname' (irb):13:in `irb_binding' irb(main):014:0> That seems reasonable. So the only 2 questions remaining for me are: Why is a list of arguments treated so differently -- it should still be an object, shouldn't it? irb(main):014:0> wossname(*x).type Array irb(main):015:0> wossname(x).type Array irb(main):016:0> x [[[2.3], 4, [5, 6]]] irb(main):017:0> Then it should still count as an expression. So why not? Should the function *x on x === Array be made available as a true method of Array? Ruby is fully OO after all, so... > > Thus the difference of p x and p *x is not very visible, but very > significant: > > p x [[[2.3], 4, [5, 6]]] > p *x [[2.3], 4, [5, 6]] Yes. > > By investigating the other constructs I listed, you'll find out the > different uses for *constructs. > > - Aleksi > Hugh hgs / dmu.ac.uk