Why this code is working

this code is a simplified version of the code I saw in Rails.

def speak(*types,&block)
block.call
end

I can understand why this code is working

speak(23) { puts ‘hi’ }

why this code is working ?. This code should fail because I am not

providing any # param to types. It means block is being passed as the
first param and that’s not # good
speak { puts ‘hi’ }

Neeraj K. wrote:

providing any # param to types. It means block is being passed as the
first param and that’s not # good
speak { puts ‘hi’ }

*args means “zero or more parameters” which are then placed in an array
and passed into the method. The block is not being passed as the first
parameter.

-Justin

On Fri, 18 Apr 2008 14:29:10 -0500, Neeraj K. wrote:

first param and that’s not # good
speak { puts ‘hi’ }

When you prefix the last argument name with a * (as you did with *types)
then you can have any number of arguments (0 or more) at the end, and
they will all be put into an array.

so

def speak(*types,&block)
p types
block.call
end

speak(23) { puts ‘hi’ }
speak { puts ‘hi’ }

will print

[23]
hi
[]
hi