# When to use \* arguments?

**URL:** <https://www.ruby-forum.com/t/when-to-use-arguments/181257>\
**Category:** Ruby\
**Created:** [January 8, 2010, 10:43am UTC](https://www.ruby-forum.com/t/when-to-use-arguments/181257 "2010-01-08T10:43:36Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![rubyernewbie](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/9dc877/32.png) [@rubyernewbie](https://www.ruby-forum.com/u/rubyernewbie)\
**Post date:** [January 8, 2010, 10:43am UTC](https://www.ruby-forum.com/t/when-to-use-arguments/181257/1 "2010-01-08T10:43:36Z")

</div>

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?

---

<div class="post-metadata">

**Author:** ![rubyernewbie](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/9dc877/32.png) [@rubyernewbie](https://www.ruby-forum.com/u/rubyernewbie)\
**Post date:** [January 8, 2010, 10:50am UTC](https://www.ruby-forum.com/t/when-to-use-arguments/181257/2 "2010-01-08T10:50:21Z")

</div>

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:in`say’

---

<div class="post-metadata">

**Author:** ![rubyernewbie](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/9dc877/32.png) [@rubyernewbie](https://www.ruby-forum.com/u/rubyernewbie)\
**Post date:** [January 8, 2010, 1:00pm UTC](https://www.ruby-forum.com/t/when-to-use-arguments/181257/3 "2010-01-08T13:00:52Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![rubyernewbie](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/9dc877/32.png) [@rubyernewbie](https://www.ruby-forum.com/u/rubyernewbie)\
**Post date:** [January 17, 2010, 3:39pm UTC](https://www.ruby-forum.com/t/when-to-use-arguments/181257/4 "2010-01-17T15:39:38Z")

</div>

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.
