[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Variable argument number and behaviour [Newbie]

Ryan Allan

7/1/2007 9:54:00 PM

Hello Everyone,

I'm trying to make a function take arguments in a particular way.

This is what I want to create:

#Variable argument testing
def function(*sometimes)

if sometimes.nil?
print "Not given!"
else
print "Here!"
end

end

function
[EOF]

As I understand it, the * operator bundles the argument into an array,
so that if test returns true. I know that I can use "if
sometimes.length==0" to get the same behaviour, but that is rather
obscure compared to the first version.

Is there some other way to set up the argument list? (Alas, I have found
nothing in the documentation or the Forum.)

Thank you,
-Ryan

--
Posted via http://www.ruby-....

6 Answers

Stefano Crocco

7/1/2007 10:05:00 PM

0

Alle domenica 1 luglio 2007, Ryan Allan ha scritto:
> Hello Everyone,
>
> I'm trying to make a function take arguments in a particular way.
>
> This is what I want to create:
>
> #Variable argument testing
> def function(*sometimes)
>
> if sometimes.nil?
> print "Not given!"
> else
> print "Here!"
> end
>
> end
>
> function
> [EOF]
>
> As I understand it, the * operator bundles the argument into an array,
> so that if test returns true. I know that I can use "if
> sometimes.length==0" to get the same behaviour, but that is rather
> obscure compared to the first version.
>
> Is there some other way to set up the argument list? (Alas, I have found
> nothing in the documentation or the Forum.)
>
> Thank you,
> -Ryan

I can't think of any other way to make a method take any number of arguments,
but remember that there's a shorter way to tell whether an array is empty:
the empty? method:

def function(*sometimes)
if sometimes.empty?
print "Not given!"
else
print "Here!"
end
end

This way, it's as clear as what you wanted to use. Besides, even if it had
been possible, your approach would have had a problem: you wouldn't have been
able to distinguish the case of a single nil argument from the case of no
arguments:

function(nil)

function()

The correct approach solves this problem: if no arguments are passed,
sometimes is empty (empty? returns true); otherwise it's not empty, even if
all arguments are nil.

I hope this helps

Stefano

yermej

7/1/2007 10:11:00 PM

0

On Jul 1, 4:53 pm, Ryan Allan <rral...@gmail.com> wrote:
> Hello Everyone,
>
> I'm trying to make a function take arguments in a particular way.
>
> This is what I want to create:
>
> #Variable argument testing
> def function(*sometimes)
>
> if sometimes.nil?
> print "Not given!"
> else
> print "Here!"
> end
>
> end
>
> function
> [EOF]
>
> As I understand it, the * operator bundles the argument into an array,
> so that if test returns true. I know that I can use "if
> sometimes.length==0" to get the same behaviour, but that is rather
> obscure compared to the first version.
>
> Is there some other way to set up the argument list? (Alas, I have found
> nothing in the documentation or the Forum.)
>
> Thank you,
> -Ryan
>
> --
> Posted viahttp://www.ruby-....

I think you are looking for default arguments:

def function(arg = nil)
# do stuff
end

If no argument is passed to function, arg will be nil, else it will
have the value passed in. Note you don't have to use nil for the
default, you could use any other value as well (even an expression).

However, if you still want to allow an arbitrary number of arguments,
I think you'll have to use the *arg syntax and check the array length
as Ruby doesn't allow:

def f(*arg = nil)
end

Jeremy

Ryan Allan

7/1/2007 10:13:00 PM

0

Thank you Stefano.
You're right; the empty? method is nicely obvious.
I do have a further question, however. You've highlighted a problem
with my original idea, but I don't understand it.

> Besides, even if it
> had been possible, your approach would have had a problem: you wouldn't have
> been able to distinguish the case of a single nil argument from the case of
> no arguments:
>
> function(nil)
>
> function()
>
> The correct approach solves this problem: if no arguments are passed,
> sometimes is empty (empty? returns true); otherwise it's not empty, even
> if all arguments are nil.

What is the difference between no arguments and a single nil argument?
It seems to me that the cases are logically equivalent. Ruby treats them
separately?

Thanks again,
-Ryan

--
Posted via http://www.ruby-....

dblack

7/1/2007 10:17:00 PM

0

Ryan Allan

7/1/2007 10:22:00 PM

0

Thank you David. That makes much more sense now.

--
Posted via http://www.ruby-....

Vu Nang Luc

7/2/2007 8:13:00 AM

0


> Yes, because nil is an object.
>
Right, and if you use Array.nil? passing no argument still return
false as following:

> a = []
> a.nil?
=>false