2015-01-29 4 views
5

다음 두 스코프는 동일한 결과를 생성합니다. 어떤 구문이 더 좋고 다른 차이가 있습니까?Ruby에서 람다와 -> 연산자의 차이점

scope :paid, lambda { |state| where(state: state) } 

scope :paid, ->(state) { where(state: state) } 

답변

9

그것은 멀티 라인 블록에 새로운 단일 라인 블록 (루비 1.9 도입) 구문과 ->lambda를 사용하기 때문에 일기 좋게 이유로 바람직이다. 예 :

# single-line 
l = ->(a, b) { a + b } 
l.call(1, 2) 

# multi-line 
l = lambda do |a, b| 
    tmp = a * 3 
    tmp * b/2 
end 
l.call(1, 2) 

bbatsov/ruby-style-guide에 설정된 커뮤니티 규칙이있는 것처럼 보입니다.

따라서, 귀하의 경우에, 더 나은 것 :

scope :paid, ->(state) { where(state: state) } 
1

이 차이 없다, 모두 같은 Proc 객체를 반환 : 제 생각에는

irb(main):033:0> lambda {|x| x*x} 
=> #<Proc:[email protected](irb):33 (lambda)> 
irb(main):034:0> ->(x) {x*x} 
=> #<Proc:[email protected](irb):34 (lambda)> 

, -> 더 읽을 수 있습니다.

3

->"과 같은 리터럴 구문입니다. 그 의미는 언어 스펙에 의해 고정됩니다.

Kernel#lambda은 다른 방법과 마찬가지로 방법입니다. 덮어 쓰기, 덮어 쓰기, monkeypatched, intercepted, ... 수 있습니다.

의미 상으로, 그들은 매우 다릅니다.

성능이 다를 수도 있습니다. Kernel#lambda적어도은 메소드 호출의 오버 헤드를 갖습니다. 실행 엔진이 런타임에 (실제로 monkeypatched 될 수 있기 때문에) Kernel#lambda을 실제로 알 수 없다는 사실은 정적 최적화를 배제 할 수 있습니다. 기존의 Ruby 실행 엔진이 람다 리터럴을 정적으로 최적화하는 것은 전혀 의미가 없습니다.