Bạn gọi toán tử -> trong Ruby là gì?


205
  1. Bạn gọi ->toán tử như sau là gì?

    ->(...) do
      ...
    end
  2. Không phải là đoạn mã sau tương đương?

    succ = ->(x) {x + 1}
    succ = lambda {|x| x + 1}

70
Thật khó chịu khi bạn không thể google "->" - câu hỏi hay để hỏi!
Kevin

10
@Kevin, tuy nhiên, bạn có thể sử dụng Tìm kiếm đàn hồi tích hợp của Stack Overflow để tìm kiếm "->": title:"->" [ruby] is:question. Điều quan trọng là sử dụng dấu ngoặc kép.

8
Symbolhound cũng có thể làm điều này: Symbolhound.com/?q=-%3E+ruby
Andrew Grimm

7
phiền toái hoặc không khó chịu, nhưng yêu cầu "ruby ->" yêu cầu cung cấp liên kết đến câu hỏi này là kết quả hàng đầu đầu tiên.
fl-web

6
@Kevin có thể mọi thứ đã thay đổi trong 2 năm qua, nhưng googling ruby "->"là cách tôi tìm thấy bài đăng này :)
Nippysaurus

Câu trả lời:


238

Trong Ngôn ngữ lập trình Ruby ("Phương thức, Procs, Lambdas và Closures"), một lambda được định nghĩa bằng cách sử dụng ->được gọi là lambda nghĩa đen .

succ = ->(x){ x+1 }
succ.call(2)

Mã này tương đương với mã sau đây.

succ = lambda { |x| x + 1 }
succ.call(2)

Một cách không chính thức, tôi đã nghe nói nó được gọi là lambda stabby hoặc theo nghĩa đen .


127

=>== Tên lửa băm

Tách các khóa từ các giá trị trong một bản đồ băm bằng chữ.


->== Tên lửa Dash

Được sử dụng để định nghĩa một chữ lambda trong Ruby 1.9.X (không có args) và Ruby 2.X (có args). Các ví dụ bạn đưa ra ( ->(x) { x * 2 }& lambda { |x| x * 2 }) trên thực tế là tương đương.


10
FYI Hai kiểu không thể thay thế hoàn toàn nếu bạn sử dụng do/ endvì các quy tắc ưu tiên. Điều này in một lambda được kiểm tra : puts -> do 1 end. Điều này vượt qua khối này puts, đánh cắp nó từ lambda và gây ra một cuộc tranh cãiError:puts lambda do 1 end
Kelvin

1
Ngoài ra, chữ lambda của ruby ​​1.9.3 không cho phép tranh luận.
Kelvin

3
@Kelvin đó sẽ là vì của Ruby cố gắng để giải thích puts lambda do 1 endnhư puts(lambda) do 1 endhơn puts(lambda do 1 end). Cái thứ hai thực sự hoạt động - Ruby chỉ cố gắng truyền khối cho putsphương thức chứ không phải lambdaphương thức nếu không có dấu ngoặc.
PJSCopeland

1
@PJSCopeland Tôi không nói rằng bạn không thể khiến họ hành động như vậy. Tôi đang nói rằng họ không thông minh cú pháp có thể hoán đổi 100%, nghĩa là bạn không thể thực hiện thay thế thả trong mọi trường hợp (vì đôi khi bạn cần thêm dấu ngoặc đơn lambda).
Kelvin

@rdurand Bạn đã thực hiện chỉnh sửa với tóm tắt "Stabby lambdas không thể chấp nhận đối số trong Ruby 1.9"? Điều này là không chính xác, ít nhất là cho 1.9.3 - args được cho phép.
Kelvin


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.