【问题标题】:Other Ruby Map Shorthand Notation其他 Ruby 映射速记表示法
【发布时间】:2012-02-06 07:04:09
【问题描述】:

我知道 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。

这样的速记存在吗?

【问题讨论】:

  • f 是您要调用的现有方法吗?

标签: ruby map shorthand


【解决方案1】:

不幸的是,这种速记符号(称为“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| p s }

【讨论】:

  • 虽然确实如此,但我不相信 OP 会认为他/她自己“幸运”必须单独定义块才能获得“更短”的map 调用。
  • @DaveNewton 我不认为你理解这个问题。看来他已经有一个现有的 Proc 或 Lambda,他在问题中将其称为 f。他可以用array.map(&f)得到他想要的,这实际上是一个比他尝试的更短的字符。
猜你喜欢
  • 2022-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-02
  • 1970-01-01
  • 2014-05-16
相关资源
最近更新 更多