[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

named method arguments with defaults

Eli Bendersky

3/11/2006 7:45:00 AM

Hello all,

What is the current idiomatic approach to pass named arguments to a
method in Ruby ?

In Perl, I can do:

sub method
{
# first the defaults are specified, then @_ is appended and overrides
# the defaults, using Perl's array-folding-into-hash feature
#
my %args = ("size" => 45,
"length" => 12,
@_);

my $the_size = $args{"size"};
}

# now, a call: 44 will override the default size 45, but length will
remain 12
#
method("size" => 44);

I'm sure Ruby has a nearly similar approach to achieve this, I just not
skilled enough (yet) to know how. Please advise.

Thanks in advance
Eli

4 Answers

Stefan Lang

3/11/2006 9:21:00 AM

0

You can use merge:

def a_method(*options)
options = {:size => 45, :length => 12}.merge(options)

# do stuff
end

a_method(:size => 44)

*should* work.

On Saturday, March 11, 2006, at 4:48 PM, wrote:
>Hello all,
>
>What is the current idiomatic approach to pass named arguments to a
>method in Ruby ?
>
>In Perl, I can do:
>
>sub method
>{
> # first the defaults are specified, then @_ is appended and overrides
> # the defaults, using Perl's array-folding-into-hash feature
> #
> my %args = ("size" => 45,
> "length" => 12,
> @_);
>
> my $the_size = $args{"size"};
>}
>
># now, a call: 44 will override the default size 45, but length will
>remain 12
>#
>method("size" => 44);
>
>I'm sure Ruby has a nearly similar approach to achieve this, I just not
>skilled enough (yet) to know how. Please advise.
>
>Thanks in advance
>Eli
>
>


Jules


--
Posted with http://De.... Sign up and save your time!


Eli Bendersky

3/11/2006 9:46:00 AM

0


Jules Jacobs wrote:
> You can use merge:
>
> def a_method(*options)
> options = {:size => 45, :length => 12}.merge(options)
>
> # do stuff
> end
>
> a_method(:size => 44)
>
> *should* work.
>

This works when I remove the asterisk from the (*options).
Makes sense, I guess, since when I call:

a_method(:size => 21, :weight => 22)

With the asterisk specified, the arguments are folded into an array,
and merge can't take an array as an argument when called on a Hash.
Without the asterisk, Ruby's "special features" takes the arguments I
passed to a_method as a Hash, since nothing came after the last x => y
assignment, and then merge works.

Did I decipher this correctly ?

In any case, your proposal (without the asterisk) works nicely. In the
1st edition of "Programming Ruby" the authors noted that by Ruby 1.8,
named arguments will be built into the language. I assume this hasn't
happened yet ?

Thanks
Eli

Stefan Lang

3/11/2006 10:39:00 AM

0

Language support for named arguments will be in Ruby 2.0 (hopefully :P)

On Saturday, March 11, 2006, at 6:48 PM, wrote:
>
>Jules Jacobs wrote:
>> You can use merge:
>>
>> def a_method(*options)
>> options = {:size => 45, :length => 12}.merge(options)
>>
>> # do stuff
>> end
>>
>> a_method(:size => 44)
>>
>> *should* work.
>>
>
>This works when I remove the asterisk from the (*options).
>Makes sense, I guess, since when I call:
>
>a_method(:size => 21, :weight => 22)
>
>With the asterisk specified, the arguments are folded into an array,
>and merge can't take an array as an argument when called on a Hash.
>Without the asterisk, Ruby's "special features" takes the arguments I
>passed to a_method as a Hash, since nothing came after the last x => y
>assignment, and then merge works.
>
>Did I decipher this correctly ?
>
>In any case, your proposal (without the asterisk) works nicely. In the
>1st edition of "Programming Ruby" the authors noted that by Ruby 1.8,
>named arguments will be built into the language. I assume this hasn't
>happened yet ?
>
>Thanks
>Eli
>
>


Jules


--
Posted with http://De.... Sign up and save your time!


Gene Tani

3/11/2006 3:38:00 PM

0


Jules Jacobs wrote:
> Language support for named arguments will be in Ruby 2.0 (hopefully :P)
>

There's a discussion of how to simulate keyword args in the draft Ruby
Cookbook, based on a KeywordProcessor module by Gavin Sinclair which i
can't seem to google for.