【问题标题】:How to use a string instead of a symbol for `Symbol#to_proc` shorthand如何在 `Symbol#to_proc` 速记中使用字符串而不是符号
【发布时间】:2012-10-01 01:28:24
【问题描述】:
a = (1..10).to_a
a.map(&:even?)
=> [false, true, false, true, false, true, false, true, false, true]

如何使用包含方法名的字符串调用map?

foo = 'even?'
a.map(...foo...)

【问题讨论】:

  • 你的意思的简写叫做“椒盐卷饼冒号”:)
  • @sawa 您编辑了这么多,以至于现在提供的答案甚至与 OP 最初提出的问题都不接近。
  • @Kyle Yours 和 Sergio 是有道理的。事实上,当我第一次阅读它时,我误解了这个问题,你的回答让我知道实际问了什么。然后我对其进行了编辑以使其清楚。 OP将其称为“与号冒号”是错误的,但这并不重要。问题是关于在这个构造中使用字符串foo
  • @sawa 我指的是标题,“而不是符号”,而我的答案只是将字符串转换为符号......我认为它使它成为一个不正确的答案。无论哪种方式,您的编辑确实改善了问题,但我认为标题可能有所不同。
  • @Kyle 是的。 OP 有一个应该使用符号的字符串,并询问如何使用该字符串。您展示了它可以转换为符号,然后使用。

标签: ruby symbols implicit-conversion proc


【解决方案1】:
foo = 'even?'
[1,2,3,4,5].map(&foo.to_sym)
 => [false, true, false, true, false]

【讨论】:

  • 我会从 IRB 中移除视觉噪音。没用。
  • 我不会说它没用。它提供了 ruby​​ 版本,也证明了这个例子是有效的。太多次像“它对我不起作用”这样的 cmets 充斥着评论部分并提供了更多的噪音。
  • 是的,它确实提供了 ruby​​ 版本,但仅此而已。作为回报,它使得无法复制/粘贴/运行代码。在我看来,这不值得:)
【解决方案2】:

简写语法不是 & 冒号,它是 & 后跟一个符号:

(1..10).map(& :even?)

在 Ruby 中,方法通常由符号引用,因此如果变量中有符号,则此语法将按预期工作:

name = :even?
(1..10).map(&name)

如果您无法控制变量方法名称,例如这是一个论点,我建议改用通用方法send。它适用于符号和字符串。

def perform enum, name
  enum.each{ |e| e.send(name) }
end

perform 1..10, "even?"

【讨论】:

  • 由于问题编辑,我的答案变得混乱,最初的问题是“如何使用 ruby​​ 速记(&:与号冒号和包含方法名称的变量?”
  • 您的回答很有帮助和教育意义。
【解决方案3】:

另一种选择,它使用“完整形式”块并且更通用。

a = (1..10).to_a
name = 'even?'
a.map{|b| b.send name} # => [false, true, false, true, false, true, false, true, false, true]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-13
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 2011-06-25
    相关资源
    最近更新 更多