Forum: Ruby Syntax error with array interpolation

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Ronald F. (Guest)
on 2007-06-25 18:43
(Received via mailing list)
Below is a code snippet which gives me some headache:

def headache
  yield(*(foo(1)),"bar")
end

def foo(n)
  [n,n+2,n+5]
end

headache { |a,b,c,d| puts a.to_s; puts b.to_s; puts c.to_s; puts d }

I had expected that this would print

1
3
6
bar


But Ruby 1.8.5 complains:

./headache.rb: line 1: def: command not found
./headache.rb: line 2: syntax error near unexpected token `*'
'/headache.rb: line 2: `  yield(*(foo(1)),"bar")

and Ruby 1.8.6 complains:

H:/tmp/headache.rb:2: syntax error, unexpected tSTRING_BEG, expecting
tAMPER
  yield(*(foo(1)),"bar")                 ^
H:/tmp/headache.rb:2: syntax error, unexpected ')', expecting kEND
H:/tmp/headache.rb:10: syntax error, unexpected $end, expecting kEND


There must something be wrong with the way I'm doing array
interpolation,
but I can't spot the error....

Ronald
Daniel L. (Guest)
on 2007-06-25 19:02
Ronald F. wrote:
> Below is a code snippet which gives me some headache:
>
> def headache
>   yield(*(foo(1)),"bar")
> end

You can't use a 'splatted' array anywhere in a method call except at the
end:

def foo(a, b, c)
  p [a, b, c]
end

foo(1, 2, *[3])       #=> works
foo(1, *[3], "asdf")  #=> doesn't work

I'm not quite sure why this should be, since it has an unambiguous
meaning, unlike defining a method with a splat in the middle of the
arguments:

def bar(a, *b, c=0)
  ...
end

The splat operator is a bit mysterious to me in this regard.....

best,
Dan
Daniel L. (Guest)
on 2007-06-25 19:04
Daniel L. wrote:
>
> You can't use a 'splatted' array anywhere in a method call except at the
> end:
>

Pardon me: and before a block argument:
foo(1, 2, *[3], &block)

Dan
This topic is locked and can not be replied to.