其他Ruby Map速记表示法

时间:2012-01-09 18:55:19

标签: ruby map shorthand

我知道地图的简写如下:

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

有人告诉我这是简写:

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

这很有道理。我的问题是:似乎应该有一种更简单的写作方式:

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

对于某些程序f。我知道我输入的方式并不是那么长,但是我认为前面的例子都不是速记存在的。这个例子似乎是第一个例子的补充:我不想为每个i调用i的to_s方法,我希望为每个x调用f。

这种简写是否存在?

1 个答案:

答案 0 :(得分:42)

不幸的是,这种速记符号(调用"符号#to_proc")无法将参数传递给被调用的方法或块,因此您甚至无法执行以下操作: / p>

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

但是你很幸运,因为你实际上并不需要这个快捷方式去做你想做的事情。 &符号可以将Proc或Lambda转换为块,反之亦然:

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

请注意my_routine之前缺少冒号。这是因为我们不想通过查找方法并在其上调用:my_routine来将.method符号转换为proc,而是我们希望将my_routine Proc转换为阻止并将其传递给map

了解这一点,您甚至可以映射本机Ruby方法:

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

method方法将采用p方法并将其转换为Proc,&将其转换为传递给map的块。结果,每个项目都被打印出来。这相当于:

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