How do I create a function that accepts an anonymous function using the "do" keyword syntax?
When used, array.each
you can specify a function in two forms:
Curly brackets:
a = [1,2,3] a.each { |x| puts x * x }
Output:
1
4
9
=> [1, 2, 3]
'do' Syntax:
a = [1,2,3]
a.each do |x|
puts (x * x)
end
Output:
1
4
9
=> [1, 2, 3]
Question: How can I replicate the "do" syntax style with my own custom function? The closest curly brace I can get is:
What I have tried:
def PutWith2Arg(proc)
puts proc.call(2)
end
PutWith2Arg(Proc.new { |x| x + 100 })
Output:
102
=> nil
source to share
Syntax do |foo| … end
and is { |foo| … }
equivalent. These are "blocks" in Ruby, and any method can get them. To call them you need:
def my_method # No need to declare that the method will get a block
yield(42) if block_given? # Pass 42 to the block, if supplied
end
my_method do |n|
puts "#{n} times 2 equals #{n*2}"
end
#=> "42 times 2 equals 84"
my_method{ |n| puts "#{n} times 2 equals #{n*2}" }
#=> "42 times 2 equals 84"
my_method # does nothing because no block was passed
or, for more complex purposes:
def my_method( &blk ) # convert the passed block to a Proc named blk
blk.call( 42 ) if blk
end
# Same results when you call my_method, with or without a block
The latter style is useful when you need to pass a block to another method. If you have a Proc or Lambda that is referenced by a variable, you can pass it to a method as a block for that method using the syntax &
:
def my_method( &blk ) # convert the passed block to a Proc named blk
[1,2,3].each( &blk ) # invoke 'each' using the same block passed to me
end
my_method{ |x| p x=>x**2 }
#=> {1=>1}
#=> {2=>4}
#=> {3=>9}
For more details, this web page is instructive enough.
source to share