2009-11-24 38 views
5

Tôi chỉ đọc câu trả lời này Converting upper-case string into title-case using Ruby.Chính xác là gì `&: capitalize` trong Ruby?

Có một dòng mã sau đây

"abc".split(/(\W)/).map(&:capitalize).join 

gì chính xác là &:capitalize? Trước khi tôi đã đặt nó vào irb bản thân mình, tôi đã có thể nói với bạn, nó không phải là cú pháp ruby ​​hợp lệ. Nó phải là một loại đối tượng Proc, bởi vì Array#map normaly mất một khối. Nhưng không phải vậy. Nếu tôi đặt nó vào irb một mình, tôi nhận được syntax error, unexpected tAMPER.

+0

Lý do nó không hoạt động trong irb cho bạn có lẽ vì, như sepp2k nói, nó chỉ được đưa vào thư viện chuẩn trong Ruby 1.8.7, và tôi đoán bạn đang chạy phiên bản cũ hơn. Bạn thấy nó khá thường xuyên, tuy nhiên, bởi vì ActiveSupport cũng ném nó vào, và ActiveSupport đi kèm với Rails. Nếu bạn thử nó trong kịch bản/bàn điều khiển của Rails, bạn có thể sẽ phát hiện ra nó hoạt động. –

+0

bản sao có thể có của [Bản đồ (&: tên) có ý nghĩa gì trong Ruby?] (Http://stackoverflow.com/questions/1217088/what-does-mapname-mean-in-ruby) –

Trả lời

6

foo(&a_proc_object) lượt a_proc_object thành một khối và gọi foo với khối đó.

foo(&not_a_proc_object) gọi to_proc trên not_a_proc_object và sau đó chuyển đối tượng proc trả về to_proc thành khối và gọi foo với khối đó.

Trong ruby ​​1.8.7+ và hỗ trợ hoạt động Symbol#to_proc được định nghĩa để trả lại một proc gọi phương thức có tên là ký hiệu trên đối số cho proc.