2010-02-14 24 views
32

thể Duplicates:
Ruby/Ruby on Rails ampersand colon shortcut
What does map(&:name) mean in Ruby?Bạn gọi toán tử &: trong Ruby là gì?

Tôi đã đọc Stackoverflow và stumbled khi đoạn mã sau

array.map(&:to_i) 

Ok, thật dễ dàng để xem những gì mã này không nhưng tôi muốn biết thêm về &: xây dựng mà tôi chưa từng thấy trước đây.

Thật không may tất cả những gì tôi có thể nghĩ là "lambda" mà nó không phải là. Google cho tôi biết rằng cú pháp lambda trong Ruby là ->->(x,y){ x * y }

Vì vậy, bất kỳ ai biết điều bí ẩn đó là gì và có thể làm gì ngoại trừ việc gọi một phương thức đơn lẻ?

+10

Đây là bản sao chính xác của * sáu * câu hỏi khác nhau. Và hãy tin tôi, Ruby đã không thay đổi * rằng * nhiều trong vòng 8 ngày qua, vì vậy các câu trả lời là * có lẽ * sẽ giống nhau: http://StackOverflow.Com/questions/99318/, http: // StackOverflow .Com/questions/1217088 /, http://StackOverflow.Com/questions/1792683/, http://StackOverflow.Com/questions/1961030/, http://StackOverflow.Com/questions/2096975/, http://StackOverflow.Com/questions/2211751/. –

+5

Chắc chắn, tôi biết điều này ngay bây giờ. Nhưng mọi cách viết mới sẽ giúp cộng đồng và trang web này. Xét cho cùng, tôi đã * tìm kiếm trước khi tôi hỏi. – vava

+4

@vava Đó là lý do * không xóa * câu hỏi. Câu hỏi của bạn vẫn nên được đóng lại. –

Trả lời

61

Có một vài chi tiết chuyển động tại đây, nhưng tên cho những gì đang xảy ra là chuyển đổi Symbol#to_proc. Đây là một phần của Ruby 1.9 trở lên và cũng có sẵn nếu bạn sử dụng phiên bản Rails sau này.

Đầu tiên, trong Ruby, :foo có nghĩa là "biểu tượng foo", vì vậy nó thực sự là hai toán tử riêng biệt mà bạn đang xem, không phải là một toán tử lớn &:.

Khi bạn nói foo.map(&bar), bạn đang nói với Ruby ", gửi thư đến đối tượng foo để gọi phương thức map, với khối tôi đã xác định được gọi là bar". Nếu bar không phải là một đối tượng Proc, Ruby sẽ cố gắng làm cho nó một.

Ở đây, chúng tôi không thực sự vượt qua một khối, nhưng thay vào đó, một biểu tượng được gọi là bar. Bởi vì chúng tôi có một chuyển đổi to_proc tiềm ẩn có sẵn trên Symbol, Ruby thấy và sử dụng nó. Hóa ra chuyển đổi này trông giống như sau:

def to_proc 
    proc { |obj, *args| obj.send(self, *args) } 
end 

Điều này làm cho phương thức có cùng tên với biểu tượng. Đưa nó tất cả cùng nhau, sử dụng ví dụ ban đầu của bạn:

array.map(&:to_i) 

này gọi .map trên mảng, và cho mỗi phần tử trong mảng, trả về kết quả của việc gọi to_i trên yếu tố đó.

+7

bản đồ (&: to_i) giống hệt với bản đồ {| x | x.to_i}. Vì bản đồ yêu cầu khối và từ ruby ​​1.9 trở đi, chuyển đổi to_proc Symbol hoàn toàn có sẵn. – Abhaya

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