시작 전에..
디테일이 부족할 수 있어요.
더 알게되면 채워 넣을게요.
광고
더치페이 대신 랜덤빵 하십쇼🚀
iOS 앱 랜덤빵
다운로드 부탁 더립니다..
루비에는 블럭이라는 문법이 있다. 스위프트의 클로저와 비슷하다.
블럭을 통해 익명함수를 만들어 메서드에 쉽게 넘겨 줄 수 있다.
[1, 2, 3].each do |e|
puts e
end
# do ... end 가 블록이다. {}를 통해 인라인으로 쓸 수 있다. array.each { |e| puts e }
블럭을 호출 하는 방법.
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
인자를 넘기지 않거나, 더 많은 수를 넘기면 에러.
def test
p = Proc.new { return "proc" }
p.call
return "test"
end
puts test
# => proc
def test(&p)
puts p.call
return "test"
end
puts test(&lambda { return "lambda" } )
# => lambda
# => test
lambda 함수에서 return을 사용하면 Proc 객체, 즉 익명 함수 자체의 반환
def test
p = Proc.new { break; return "proc" }
p.call
return "test"
end
puts test
# => break from proc-closure (LocalJumpError)
Proc 객체에서
를 사용하면 에러가 발생한다.
def test(&p)
puts p.call
return "test"
end
puts test(&lambda { break; return "lambda" } )
# => test
람다 내부의 break
는 람다 객체 안으로 한정 됨. 메소드에는 영향이 없다.
더치페이 대신 랜덤빵 하십쇼🚀
iOS 앱 랜덤빵
다운로드 버탁 더립니더..