2012-01-09 22 views
17

Tôi nhận thức được viết tắt cho bản đồ mà trông giống như:khác của Ruby Bản đồ Shorthand Notation

[1, 2, 3, 4].map(&:to_s) 
> ["1", "2", "3", "4"] 

Tôi đã nói là viết tắt này cho:

[1, 2, 3, 4].map{|i| i.to_s} 

Điều này làm cho cảm giác hoàn hảo. Câu hỏi của tôi là: Có vẻ như có một cách dễ dàng hơn để viết:

[1, 2, 3, 4].map{|x| f.call(x)} 

cho một số thủ tục f. Tôi biết cách tôi chỉ cần gõ không phải là tất cả những gì dài để bắt đầu, nhưng tôi muốn tranh luận rằng không phải là ví dụ trước mà tốc ký tồn tại. Ví dụ này chỉ có vẻ giống như bổ sung cho ví dụ đầu tiên: Thay vì gọi phương thức to_s của i cho mọi i, tôi muốn gọi f cho mỗi x.

Cách viết tắt này tồn tại?

+0

Có phải 'f' là phương pháp hiện có bạn muốn gọi không? –

Trả lời

36

Đáng tiếc là ký hiệu viết tắt này (mà gọi là "Symbol # to_proc") không có một cách để vượt qua đối số cho phương pháp hoặc chặn được gọi, vì vậy bạn có thể thậm chí không làm như sau:

array_of_strings.map(&:include, 'l') #=> this would fail 

NHƯNG, bạn may mắn vì bạn không thực sự cần phím tắt này để làm những gì bạn đang cố gắng làm. Dấu và có thể chuyển đổi một Proc hoặc Lambda thành một khối, và ngược lại:

my_routine = Proc.new { |str| str.upcase } 
%w{ one two three }.map &my_routine #=> ['ONE', 'TWO', 'THREE'] 

Note thiếu của đại tràng trước khi my_routine. Điều này là do chúng tôi không muốn chuyển đổi biểu tượng :my_routine thành một proc bằng cách tìm phương thức và gọi .method trên đó, thay vào đó chúng tôi muốn chuyển đổi my_routine Proc thành một khối và chuyển nó đến map.

Biết được điều này, bạn thậm chí có thể ánh xạ một phương pháp của Ruby mẹ đẻ:

%w{ one two three }.map &method(:p) 

Phương pháp method sẽ mất phương pháp p và chuyển đổi nó thành một Proc, và & chuyển đổi nó thành một khối mà được thông qua để map. Kết quả là, mỗi mục được in. Điều này tương đương với điều này:

%w{ one two three }.map { |s| p s } 
+3

Trong khi chắc chắn đúng, tôi không tin rằng OP sẽ xem xét anh ta/mình "may mắn" để có để xác định khối riêng biệt để có được một "ngắn hơn" bản đồ 'gọi. –

+5

@DaveNewton Tôi không nghĩ rằng bạn hiểu câu hỏi. Dường như anh ta đã có một Proc hoặc Lambda hiện tại mà anh ta gọi là 'f' trong câu hỏi. Anh ta có thể có được những gì anh ta muốn với 'array.map (& f)', mà thực sự là một nhân vật ngắn hơn so với những gì anh ta đã thử. – coreyward

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