其他Ruby Map速记表示法
我知道地图的简写如下:
[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。
这样的速记是否存在?
不幸的是,这种简写符号(称为“Symbol#to_proc”)无法将参数传递给被调用的方法或块,因此您甚至无法执行以下操作:
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
之前缺少冒号。 这是因为我们不想通过查找方法并在其上调用.method
将:my_routine
符号转换为proc,而是希望将my_routine
Proc转换为块并将其传递给map
。
知道了这一点,你甚至可以映射一个原生的Ruby方法:
%w{ one two three }.map &method(:p)
method
方法将采用p
方法并将其转换为Proc,并将&
转换为传递给map
的块。 结果,每个项目都被打印出来。 这相当于:
%w{ one two three }.map { |s| ps }