When to use * arguments?

version one:

def say(*a)
a.each {|r| puts r }
end

say(1,2,3)

version two:

def say(a)
a.each {|r| puts r }
end

say([1,2,3])

So, any different here? when should we * arguments like version one?

El Viernes, 8 de Enero de 2010, Zhenning G. escribió:

def say(a)
a.each {|r| puts r }
end

say([1,2,3])

So, any different here? when should we * arguments like version one?

  • is useful when you don’t know the number and kind of arguments the
    method
    will receive. Using * will convert any arguments to an Array.

In your first version:

irb> say 123
123
[123] <-- returns an Array

In your second version:

irb> say 123
NoMethodError: undefined method each' for 2:Fixnum from (irb):6:insay’

Hi,

Am Freitag, 08. Jan 2010, 18:43:41 +0900 schrieb Zhenning G.:

say([1,2,3])
So, any different here? when should we * arguments like version one?

Sometimes you have to use splats: when you call another method and
you don’t know what arguments that one takes. Object.new does this
internally. It’s something like

class Object
class <<self
def new *args
instance = allocate_space
instance.initialize *args # <<<
instance
end
end
end

Bertram

On 08.01.2010 13:00, Bertram S. wrote:

It’s something like

class Object
class <<self
def new *args
instance = allocate_space
instance.initialize *args # <<<
instance
end
end
end

To nitpick (I know it isn’t relevant to the discussion at hand), it’s
actually
more something like:

class Class # instance method of Class, not singleton method of Object
def new *args, &blk # Can take (and will pass) a block, too
# Calls Class#allocate (or a particular class’s override of that
method)
instance = allocate
instance.send(:initialize, *args, &blk) # initialize is a private
method
instance
end
end

Except, of course, it’s written in C.