How can I have a block that optionally takes an argument? Thanks.
Vincent.
How can I have a block that optionally takes an argument? Thanks.
Vincent.
Vincent Foley wrote:
How can I have a block that optionally takes an argument? Thanks.
This has been involved in a recent discussion for how-to handle true anonymous functions in ruby. Currently you can't do this with proc or Procs, the same way you can with methods. A workaround is to use *args, since it will capture any/all parameters passed to the method and put them in an array:
irb(main):013:0> pr = proc { |*args| args.length }
=> #<Proc:0xb7c8f154@(irb):13>
irb(main):014:0> pr.call
=> 0
irb(main):015:0> pr.call "hey"
=> 1
irb(main):016:0> pr.call [ 1,2,3 ]
=> 1
irb(main):017:0> pr.call [ 1,2,3 ], :key=>'val', :key2=>'val2'
=> 2
Zach
irb(main):001:0> p = proc do |*a|
irb(main):002:1* if a[0]
irb(main):003:2> puts "Got parameter: #{a[0]}"
irb(main):004:2> else
irb(main):005:2* puts "No parameter"
irb(main):006:2> end
irb(main):007:1> end
=> #<Proc:0x02b5d640@(irb):1>
irb(main):008:0> p.call
No parameter
=> nil
irb(main):009:0> p.call 1
Got parameter: 1
=> nil
Ryan
On 11/4/05, Vincent Foley <vfoley@gmail.com> wrote:
How can I have a block that optionally takes an argument? Thanks.
I seem to remember Ara Howard recently answered this with an idiom
something like this (apologies to Ara if I've remembered incorrectly):
block = proc{|*args|
a, b = *args
a ||= 1
b ||= 2
p [a, b]
}
block.call
block.call(99)
block.call(99, 100)
__END__
[1, 2]
[99, 2]
[99, 100]
On 11/5/05, Vincent Foley <vfoley@gmail.com> wrote:
How can I have a block that optionally takes an argument? Thanks.
Vincent.
Hi --
On Sat, 5 Nov 2005, Ryan Leavengood wrote:
On 11/4/05, Vincent Foley <vfoley@gmail.com> wrote:
How can I have a block that optionally takes an argument? Thanks.
irb(main):001:0> p = proc do |*a|
irb(main):002:1* if a[0]
I think you'd have to use a.size since with "if a[0]" you'll get false
positives if the first arg is nil or false.
David
--
David A. Black
dblack@wobblini.net