2015-01-29 11 views

Odpowiedz

9

Jest to korzystne ze względów czytelności, aby wykorzystać nową składnię -> (wprowadzone Ruby 1.9) dla bloków pojedynczej linii i lambda wielu bloków linii. Przykład:

# 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) 

Wygląda na to, że konwencja wspólnotowa została ustanowiona w bbatsov/ruby-style-guide.

Więc w twoim przypadku, byłoby lepiej:

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

Nie ma żadnej różnicy, zarówno zwraca taką samą Proc obiektu:

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)> 

Moim zdaniem -> jest bardziej czytelny.

3

-> jest dosłowna składnia, jak ". Jego znaczenie jest ustalone przez specyfikację językową.

Kernel#lambda to metoda, jak każda inna metoda. Może on zostać zastąpiony, usunięty, zastąpiony, niedopowiedziany, przechwycony ...

Tak więc, semantycznie, są one bardzo różne.

Jest również możliwe, że ich wydajność jest inna. Kernel#lambda będzie co najmniej mają narzut wywołania metody. Fakt, że silnik wykonawczy nie może w rzeczywistości wiedzieć, co zrobi Kernel#lambda w czasie wykonywania (ponieważ może to być monkeypatched) również wykluczałby jakiekolwiek statyczne optymalizacje, chociaż nie wierzę, że jakikolwiek istniejący silnik wykonujący Ruby statycznie optymalizuje literały lambda w jakikolwiek znaczący sposób.

Powiązane problemy