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

      

+3


source to share


1 answer


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.

+5


source







All Articles