Re: Optional arguments and default values
- From: "Robert Klemme" <bob.news@xxxxxxx>
- Date: Sat, 31 Dec 2005 13:58:14 +0100
Ross Bamford <rosco@xxxxxxxxxxxxxxxxxxxxxx> wrote:
On Fri, 30 Dec 2005 19:59:05 -0000, Surgeon <biyokuantum@xxxxxxxxx> wrote:Hi,
How do I give a method optional arguments and default values?
Exmpl:
foo is a function that multiplies all of its arguments together. If there is not any argument, a default value of "qwerty" returns.
foo(2,3) ----> 6 foo(2,3,5) ----> 30 foo(2,3,5,2) -> 60
foo() -----------> "qwerty"
Maybe: def foo(*args) args.empty? && "qwerty" or args.inject(0) { |s,i| s * i } end
or:
def foo(*args) if args.empty? "qwerty" else args.inject(0) { |s,i| s * i } end end
The implementation of Enumerable#inject allows for an even more elegant solution
def foo(*args)
args.inject {|a,b| a*b} || "qwerty"
end=> 30foo 2,3,5
=> 6foo 2,3
=> 2foo 2
foo
=> "qwerty"
Note: if args is empty this inject returns nil, if there is just one element that is returned.
Another solution would be to implement things like this in Enumerable:
module Enumerable
def sum() inject(0) {|a,b| a+b} end
def product() inject(1) {|a,b| a*b} end
endor
module Enumerable
def sum() inject {|a,b| a+b} end
def product() inject {|a,b| a*b} end
endAllowing for invocations like these
=> 10[1,2,3,4].sum
=> 10(1..4).sum
=> 10(1...5).sum
(1..10).map { rand 20 }.sum
=> 91
Kind regards
robert
.
- Follow-Ups:
- Re: Optional arguments and default values
- From: Ross Bamford
- Re: Optional arguments and default values
- References:
- Optional arguments and default values
- From: Surgeon
- Re: Optional arguments and default values
- From: Ross Bamford
- Optional arguments and default values
- Prev by Date: Re: Numeric Maze (#60)
- Next by Date: Re: Gateway issues again
- Previous by thread: Re: Optional arguments and default values
- Next by thread: Re: Optional arguments and default values
- Index(es):
Relevant Pages
|