From: Robert Klemme Date: 2005-12-31T22:02:56+09:00 Subject: Re: Optional arguments and default values Ross Bamford wrote: > On Fri, 30 Dec 2005 19:59:05 -0000, Surgeon > 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 >> foo 2,3,5 => 30 >> foo 2,3 => 6 >> foo 2 => 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 end or module Enumerable def sum() inject {|a,b| a+b} end def product() inject {|a,b| a*b} end end Allowing for invocations like these >> [1,2,3,4].sum => 10 >> (1..4).sum => 10 >> (1...5).sum => 10 >> (1..10).map { rand 20 }.sum => 91 Kind regards robert