Ruby 블록과 Lambda
Source: Dev.to
Ruby 블록(Block)
Ruby의 블록(Block)은 메서드 호출과 함께 코드 블록을 전달하는 방법입니다.
def call_block
puts 'Start of method'
yield
yield
puts 'End of method'
end
call_block { puts 'In the block' }
블록에 인자를 전달할 수도 있습니다.
def call_block
yield('hello', 99)
end
call_block { |str, num| puts str + ' ' + num.to_s }
block_given? 로 블록 존재 여부를 확인할 수 있습니다.
def try
if block_given?
yield
else
puts "no block"
end
end
try # => "no block"
try { puts "hello" } # => "hello"
try do puts "hello" end # => "hello"
블록 내부에서 사용되는 변수는 블록 외부와 별개의 스코프를 가집니다.
x = 10
5.times do |x|
puts "x inside the block: #{x}"
end
puts "x outside the block: #{x}"
Lambda
Lambda는 익명 함수를 만드는 방법이며, lambda 혹은 -> 로 정의합니다.
prc = lambda { puts 'Hello' }
prc.call
여러 줄 Lambda
toast = lambda do
'Cheers'
end
puts toast.call
Lambda를 메서드에 인자로 전달할 수도 있습니다.
def some_mtd(some_proc)
puts 'Start of mtd'
some_proc.call
puts 'End of mtd'
end
say = lambda do
puts 'Hello'
end
some_mtd(say)
인자를 받는 Lambda 예시:
a_Block = lambda { |x| "Hello #{x}!" }
puts a_Block.call('World') # => "Hello World!"