2015-01-29 18 views

Trả lời

9

Đó là một lợi thế, vì lý do readibility, sử dụng cú pháp mới -> (giới thiệu trong Ruby 1.9) cho các khối đơn dòng và lambda cho các khối đa dòng. Ví dụ:

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

Dường như quy ước cộng đồng được thiết lập trong bbatsov/ruby-style-guide.

Vì vậy, trong trường hợp của bạn, sẽ là tốt hơn:

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

Không có sự khác biệt, cả hai trả về cùng một đối tượng 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)> 

Theo tôi, -> là dễ đọc hơn.

3

-> là cú pháp theo ngữ cảnh, như ". Ý nghĩa của nó được cố định bởi đặc tả ngôn ngữ.

Kernel#lambda là phương pháp giống như bất kỳ phương pháp nào khác. Nó có thể bị ghi đè, xóa, ghi đè, monkeypatched, chặn,…

Vì vậy, ngữ nghĩa, chúng rất khác nhau.

Cũng có thể hiệu suất của chúng khác nhau. Kernel#lambda sẽ ít nhất có phí của cuộc gọi phương thức. Thực tế là động cơ thực thi không thể thực sự biết được Kernel#lambda làm gì khi chạy (vì nó có thể là khỉ) cũng sẽ loại bỏ bất kỳ tối ưu hóa tĩnh nào, mặc dù tôi không tin bất kỳ công cụ thực thi Ruby nào tối ưu hóa các chữ lambda một cách có ý nghĩa.

Các vấn đề liên quan