block, proc, lambda in ruby

HyoKwangRyu·2020년 9월 18일
2

Ruby on Rails

목록 보기
4/6

시작 전에..
디테일이 부족할 수 있어요.
더 알게되면 채워 넣을게요.

광고
더치페이 대신 랜덤빵 하십쇼🚀
iOS 앱 랜덤빵
다운로드 부탁 더립니다..

block

루비에는 블럭이라는 문법이 있다. 스위프트의 클로저와 비슷하다.

블럭을 통해 익명함수를 만들어 메서드에 쉽게 넘겨 줄 수 있다.

[1, 2, 3].each do |e|
  puts e
end

# do ... end 가 블록이다. {}를 통해 인라인으로 쓸 수 있다. array.each { |e| puts e }

yield

블럭을 호출 하는 방법.

def test
  puts "test1"
  yield 
  puts "test2"
end

test do
  puts "block test"
end

# => test1
# => block test
# => test2

test 메소드가 실행 되고, yield 를 호출할때 블럭 내부의 코드가 실행된다. 블럭 코드가 끝나면 test 메소드 내의 yield 이후 코드가 실행 됨.

하지만 yield 가 있으면 코드 블럭이 무조건 전달되어야 한다. 그렇지 않으면 에러가 발생 함.

그래서 yield if block_given? 같은 식으로 사용할 수 있다.

def test
  puts "test1"
  yield("Hello", "World")
  puts "test2"
end

test do |first, second|
  puts "#{first} #{second}"
end

# => test1
# => Hello World
# => test2

yield도 파라미터를 받을 수 있다. 순서가 있는 파라미터다.

블럭내의 파라미터는 블럭 한정 지역변수가 된다.

yield 값은 블럭의 리턴값이다.

Proc, Lambda

명시적으로 익명 함수 객체를 생성하는 방법: Proc 객체와 lambda문 사용하기.

차이점

인자 검사 방식의 차이

  • Proc

    절차만 저장된 객체

    함수 인자 개수가 달라지더라도 에러가 발생하지 않음.

  • lambda

    인자를 넘기지 않거나, 더 많은 수를 넘기면 에러.

Return 방식의 차이.

  • Proc
def test
  p = Proc.new { return "proc" }
    p.call
  return "test"
end

puts test

# => proc
  • lambda
def test(&p)
  puts p.call
  return "test"
end

puts test(&lambda { return "lambda" } )

# => lambda
# => test

lambda 함수에서 return을 사용하면 Proc 객체, 즉 익명 함수 자체의 반환

break 차이

  • Proc
def test
  p = Proc.new { break; return "proc" }
    p.call
  return "test"
end

puts test

# => break from proc-closure (LocalJumpError)

Proc 객체에서

를 사용하면 에러가 발생한다.

  • lambda
def test(&p)
  puts p.call
  return "test"
end

puts test(&lambda { break; return "lambda" } )

# => test

람다 내부의 break 는 람다 객체 안으로 한정 됨. 메소드에는 영향이 없다.

한번더

더치페이 대신 랜덤빵 하십쇼🚀
iOS 앱 랜덤빵
다운로드 버탁 더립니더..

profile
Backend Developer

0개의 댓글