【问题标题】:Pass a function by name in Ruby在 Ruby 中按名称传递函数
【发布时间】:2012-11-28 08:52:26
【问题描述】:

如何在 Ruby 中按名称传递函数? (我只用了几个小时的 Ruby,所以我还在搞清楚。)

nums = [1, 2, 3, 4]

# This works, but is more verbose than I'd like    
nums.each do |i|
  puts i
end

# In JS, I could just do something like:
# nums.forEach(console.log)

# In F#, it would be something like:
# List.iter nums (printf "%A")

# In Ruby, I wish I could do something like:
nums.each puts

在 Ruby 中可以同样简洁地完成吗?我可以只按名称引用函数而不是使用块吗?

投票结束的人:你能解释一下为什么这不是一个真正的问题吗?

【问题讨论】:

标签: ruby functional-programming


【解决方案1】:

您可以执行以下操作:

nums = [1, 2, 3, 4]
nums.each(&method(:puts))

This article 很好地解释了 Ruby 中 procs、blocks 和 lambdas 之间的区别。

【讨论】:

  • 也可以指定实例方法,例如nums.each(&$stderr.method(:puts))
【解决方案2】:

我可以只按名称引用函数而不是将其包装在一个块中吗?

你不是在“包装”它——块函数。

如果考虑简洁,您可以使用方括号代替do..end

nums.each {|i| puts i}

【讨论】:

    【解决方案3】:

    不是开箱即用的,虽然你可以使用method

    def invoke(enum, meth)
      enum.each { |e| method(meth).call(e) }
    end
    

    我更喜欢将它包裹在一个猴子补丁Enumerable 中。

    还有其他方法可以解决这个问题;这是一种蛮力。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-16
      • 1970-01-01
      • 1970-01-01
      • 2019-09-14
      • 1970-01-01
      • 2017-03-23
      • 2016-03-22
      • 2020-01-05
      相关资源
      最近更新 更多