2013-05-17 22 views
7

Vì vậy, tôi vừa học được rằng thay vì viết những thứ như:Ruby cố gắng nắm bắt một ký hiệu mới. (Tiêm (:) vs chọn (&: chẵn); tại sao người ta có &?)

[1,2,3,4,5].inject {|x,y| x + y} => 15 

tôi có thể viết

[1,2,3,4,5].inject(:+) => 15 

tôi cũng học được rằng thay vì viết

[1,2,3,4,5].select {|x| x.even?} => [2,4] 

tôi có thể viết

[1,2,3,4,5].select(&:even?) => [2,4] 

Câu hỏi của tôi là lý do tại sao một (chọn) sử dụng & và một (tiêm) khác thì không. Tôi chắc chắn rằng : là vì even?+ được xử lý ở các ký hiệu, nhưng tôi muốn làm rõ lý do tại sao & được sử dụng trong một và tại sao sử dụng :.

Ngoài ra, tôi biết rằng tôi có thể thực hiện các ký hiệu này trên nhiều hơn chỉ là injectselect.

Rất cám ơn!

Trả lời

10

& toán tử trong trường hợp này chuyển đổi ký hiệu thành proc. Vì vậy, các mã thực hiện điều này dưới mui xe:

[1,2,3,4,5].select {|elem| elem.send :even? } # => [2, 4] 

Thực hiện inject phương pháp công nhận sự cần thiết của những đặc điểm kỹ thuật phương pháp phím tắt và bổ sung thêm một xử lý đặc biệt khi biểu tượng là đi như một tham số. Vì vậy, trong trường hợp này, về cơ bản nó thực hiện những gì mà toán tử & thực hiện.

tại sao người ta (chọn) sử dụng & và một trong những khác (tiêm) không

Bởi vì không ai thực hiện select theo cách này. Ruby là mã nguồn mở, họ thậm chí có thể chấp nhận bản vá của bạn. Đi và sửa lỗi này :)

P.S .: Nhưng nếu điều đó tùy thuộc vào tôi, thay vào đó, tôi sẽ xóa xử lý đặc biệt của quá trình tiêm. Nó cảm thấy một chút dư thừa và khó hiểu trong sự hiện diện của Symbol#to_proc (đó là những gì sử dụng nhà điều hành &).

+0

Tôi hiểu. Rất, rất thú vị! Trong Ruby, tôi thấy rằng rất nhiều điều rất đơn giản để làm, như tôi đã làm với lựa chọn của tôi. Bạn đã đi tiếp và viết '{| elem | elem.send: even?} 'Đây có phải là bản chất khối của tôi đang làm gì trong nền không? Thay đổi chính nó thành định dạng đó và sau đó thực hiện bất kỳ tính toán nào nó có nghĩa là phải làm gì? Có rất nhiều cách khác nhau để làm mọi thứ trong Ruby. Tôi tò mò. – David

+0

@David: vâng, đó là những gì 'select (&: even?)' Làm theo mui xe. –

+1

@ David không quên chấp nhận câu trả lời, nếu nó thực sự trả lời câu hỏi! – vgoff

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