2012-02-08 27 views
7

thể trùng lặp:
What does map(&:name) mean in Ruby?
Ruby/Ruby on Rails ampersand colon shortcutnhững gì hiện &: có nghĩa là trong ruby, nó là một khối pha trộn với một biểu tượng?

Ví dụ,

contacts.sort_by(&:first_name). 

Tôi hiểu điều này không, nhưng tôi không hiểu được &: ký hiệu, những gì hiện có nghĩa là, nó là một biểu tượng (:) với một khối (&)? Tôi có thể đọc thêm về nó ở đâu?

+2

Đây là một bản sao của không ít hơn 16 câu hỏi khác mà đã được hỏi và trả lời ở đây trên StackOverflow:. [Understanding \ [ClassOne, ClassTwo \] mỗi \ (& : 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/),… –

+2

… [Đây là gì' &: last' Ruby Construct Called?] (Http://StackOverflow.Com/q/2211751/), [Bạn gọi cái gì '&:' operator trong Ruby?] (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. thu thập (&: views_count) '] (http://StackOverflow.Com/q/3888044/), [Cú pháp Proc của Ruby] (http://StackOverflow.Com/q/4512587/), [Làm thế nào để" '(1 ..4) .inject (&: +) '” hoạt động trong Ruby] (http://StackOverflow.Com/q/5003257/),… –

+2

… [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 tài sản trong ruby? tức là '&: first'] (http: // StackOverflow.Com/q/6289084 /) và [Array # map' có tham số như thế nào?] (Http://StackOverflow.Com/q/6716629/). –

Trả lời

8

Khi & sử dụng trước đối tượng Proc trong lời gọi phương thức, nó xử lý Proc như thể nó là một khối bình thường sau khi gọi.
Khi sử dụng & trước loại đối tượng khác (biểu tượng :first_name trong trường hợp của bạn) trong lời gọi phương thức, nó cố gắng gọi to_proc trên đối tượng này và nếu không có phương pháp to_proc, bạn sẽ nhận được TypeError.

Thường là &:first_name giống với &:first_name.to_proc.

Symbol#to_proc Trả về đối tượng Proc phản hồi phương thức đã cho theo sym.

:first_name.to_proc sẽ trở lại Proc trông như thế này:

proc { |obj, *args, &block| obj.first_name(*args, &block) } 

này Proc gọi phương pháp xác định bởi biểu tượng ban đầu về đối tượng đi làm tham số đầu tiên và vượt qua tất cả các thông số còn lại + khối như phương pháp này lập luận .

Thêm một ví dụ:

> p = :each.to_proc 
=> #<Proc:0x00000001bc28b0> 
> p.call([1,2,3]) { |item| puts item+1 } 
2 
3 
4 
=> [1, 2, 3] 
3

Nó là tương tự với contacts.sort_by {|o| o.first_name}

Nó trả về một đối tượng Proc mà đáp ứng với các phương pháp do sym.

+1

Được giảm hạng để không khuyến khích câu trả lời cho các câu hỏi thường bị sao chép. – Phrogz

+0

@Phrogz Vì vậy, tôi nên tìm kiếm đầu tiên khi trả lời một câu hỏi? – xdazz

+0

Theo tôi, vâng. Lấy làm tiếc. Câu hỏi này phải được đóng và xóa vì lợi ích của Stack Overflow. Sẽ khó khăn hơn khi xóa câu hỏi khi có câu trả lời trong đó. – Phrogz

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