2012-02-24 37 views
25

thể trùng lặp:
What does map(&:name) mean in Ruby?chức năng của toán tử "&:" trong ruby ​​là gì?

Tôi đã xem qua một đoạn mã trong đó có những điều sau

a.each_slice(2).map(&:reverse) 

Tôi không biết các chức năng của &: điều hành. Nó hoạt động như thế nào?

+0

Đây là một bản sao của không ít hơn 17 câu hỏi khác mà đã được hỏi và trả lời ở đây trên StackOverflow: [Understanding \ [ClassOne , ClassTwo \] .each \ (&: my_method \)] (http://StackOverflow.Com/q/99318/), [Bản đồ (&: name) 'có nghĩa là gì trong Ruby?] (Http: // StackOverflow.Com/q/1217088/), [Chính xác là gì 'và: viết hoa' trong Ruby?] (Http://StackOverflow.Com/q/1792683/), [Ruby/Ruby on Rails dấu và phím tắt dấu hai chấm] (http : //StackOverflow.Com/q/1961030/), [Ruby: '&: symbol' syntax] (http://StackOverflow.Com/q/2096975/),… –

+0

… [Đây là gì '&: last' Ruby Construct Called?] (Http://StackOverflow.Com/q/2211751/), [Bạn gọi toán tử' &: 'trong Ruby là gì?] (Http://StackOverflow.Com/q/2259775/), [Bản đồ (&: name) 'làm gì trong mã Ruby này?] (Http://StackOverflow.Com/q/2388337/), [là gì: + 'và' & + 'trong ruby?] (http://StackOverflow.Com/q/2697024/), [' &: views_count' trong 'Post.published.collect (&: views_count)'] (http: // StackOverflow.Com/q/3888044/), [Ruby Proc Syntax] (http://StackOverflow.Com/q/4512587/), [Làm thế nào để "' (1..4) .inject (&: +) '" làm việc trong Ruby] (http://StackOverflow.Com/q/5003257/),… –

+0

… [Câu lệnh sau '&: property'?] (http://StackOverflow.Com/q/5620411/), [ '&' Có nghĩa là gì trong cú pháp ruby ​​sau đây?] (Http://StackOverflow.Com/q/5952175/), [Tại sao một người dùng toán tử đơn nhất trên một thuộc tính trong ruby? tức là '&: first'] (http://StackOverflow.Com/q/6289084/), [làm thế nào để' Array # map' có tham số để làm một cái gì đó như thế này?] (http://StackOverflow.Com/q/ 6716629 /), và [có nghĩa là gì '&:' có nghĩa là trong ruby, nó là một khối pha trộn với một biểu tượng?] (Http://StackOverflow.Com/q/9188362/). –

Trả lời

60

Không có toán tử &: trong Ruby. Những gì bạn thấy là nhà điều hành & áp dụng cho một số :symbol. Trong một danh sách đối số phương thức, toán tử & có toán hạng của nó, chuyển đổi nó thành đối tượng Proc nếu chưa có (bằng cách gọi to_proc đối tượng đó) và chuyển cho phương thức như thể một khối đã được sử dụng.

my_proc = Proc.new { puts "foo" } 

my_method_call(&my_proc) # is identical to: 
my_method_call { puts "foo" } 

Vì vậy, câu hỏi bây giờ trở thành "không Symbol#to_proc làm gì?", Và đó là dễ dàng nhận thấy trong the Rails documentation:

Biến biểu tượng thành một proc đơn giản, đó là đặc biệt hữu ích cho enumerations. Ví dụ:

# The same as people.collect { |p| p.name } 
people.collect(&:name) 

# The same as people.select { |p| p.manager? }.collect { |p| p.salary } 
people.select(&:manager?).collect(&:salary) 
+3

Bạn đang ngụ ý nó, nhưng nó sẽ là tốt hơn để nói cho nó một cách rõ ràng: đây là một sửa đổi Rails nào, và nó không được xây dựng trong Ruby chính nó. – kikito

+5

@kikito: http://ruby-doc.org/core-1.9.3/Symbol.html#method-i-to_proc – tokland

+0

Bạn nói đúng - Tôi vừa thử nó ở dạng đồng bằng irb (1.8.7), đó là trong chính Ruby. Cái này không được Rails cung cấp. Cảm ơn bạn đã sửa lỗi của tôi! – kikito

18

Bằng cách thêm vào trước & đến một biểu tượng bạn đang tạo một hàm lambda rằng sẽ gọi phương thức với một tên mà biểu tượng trên đối tượng bạn vượt qua vào chức năng này. Lấy đó vào tài khoản:

ar.map(&:reverse) 

là tương đương với:

ar.map { |element| element.reverse } 
+2

Vui lòng không trả lời các câu hỏi trùng lặp. Chỉ cần bỏ phiếu để đóng. Câu hỏi này đã được hỏi và trả lời là 17 (!!!) lần, thực sự không có gì * đạt được bằng cách truyền bá kiến ​​thức nhiều hơn nữa. –

+10

Tôi đã thấy một câu hỏi và tôi đã trả lời câu hỏi đó. Nó được đánh dấu là trùng lặp chỉ sau đó. –

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