block,proc,lambda관련 포스팅 인덱스
Lambda란
Proc객체의 한종류
block을 객체화한것
block을 패키징한것
block을 객체화 하는 이유?
Proc이 존재하는 이유와 같다.
아래 링크를 참조
Proc Lambda차이
기본적으로는 같다.
return방식이나 인자체크의 동작방식에 조금 차이가 있다.
자세한건 아래링크를 참조
ruby 절차오브젝트 proc,lambda의 차이에 대해 알아보자
lambda인지 확인하는 방법
위에서 설명했듯이 lambda도 Proc객체이다.
혹시 lambda로 생성된 함수인지 확인하고 싶다면 lambda?
메소드가 유용하다.
Proc.new{}.lambda? # => false
proc{}.lambda? # => false
lambda{}.lambda? # => true
->{}.lambda? # => true
Lambda선언 방법
lambda선언 방법은 아래와 같다.
l1 = lambda do |x|
puts "dahyun #{x}"
end
신텍스 슈가로 ->
로도 선언이 가능하다.
l2 = ->(x) do
puts "dahyun #{x}"
end
Lambda실행 방법
Proc과 완전히 동일하다.
.call()
,.yield()
,[]
,()
이 있다.
l = lambda do |x|
puts "dahyun #{x}"
end
l.call('cuty') # => dahyun cuty
l.yield('sexy') # => dahyun sexy
l.('pretty') # => dahyun pretty
l['kawaii'] # => dahyun kawaii
일반메소드 Proc객체 변환시 = lambda로 생성된 함수
참고로 일반적인 메서드를 객체화해서 Proc 객체로 변환하면 람다 Proc 객체가 된다.
def hello; end
hello_method = method(:hello)
hello_method.to_proc.lambda? # => true
메모
lambda 객체의 신텍스슈가 선언방식인 ->
과 블록인 {}
실행방법 4가지를 이해하면 아래와 같은 괴상한 코드가 뭘 하는지 납득이 된다 ㅎ
pp ->(){}[] # nil
pp ->()do end[] # nil
pp ->(){}.() # nil
pp ->(){}.yield # nil
pp ->(){}.call # nil