【问题标题】:why doesn't this work: x.map(&:+"A") [duplicate]为什么这不起作用: x.map(&:+"A") [重复]
【发布时间】:2023-04-03 08:33:02
【问题描述】:

来自我的read

something {|i| i.foo } 
something(&:foo)

是等价的。所以如果 x = %w(a b c d),为什么不是下面的等价物:

x.map {|s| s.+ "A"}
x.map {&:+ "A"}

?

第一个按预期工作(我得到 ["aA","bA","cA","dA"]),但无论我尝试什么,第二个都会出错。

【问题讨论】:

  • 你不能将参数传递给那些 Symbol#to_proc 调用。

标签: ruby ruby-1.9 ampersand


【解决方案1】:

如果这行得通,作为一名红宝石学家,您将无事可做。我写了一个基于#method_missing 的整个后缀类来解决这个问题。简单的肮脏解决方案是:

x = ?a, ?b, ?c

def x.rap( sym, arg )
  map {|e| e.send sym, arg }
end

x.rap :+, "A"

【讨论】:

  • 试过了,然后 x.rap(&:+ "A") 出错了。红宝石 1.9.3p125
【解决方案2】:

Symbol::to_proc 不接受参数。

您可以将to_proc 方法添加到Array

class Array
  def to_proc
    lambda { |o| o.__send__(*self) }
  end
end

# then use it as below
x.map &[:+, "a"]

【讨论】:

  • 这是一个非常有趣的答案,谢谢。 #send 不够,需要 send 的任何原因?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-08
  • 1970-01-01
  • 2012-11-17
相关资源
最近更新 更多