ruby - 如何在 Ruby 中调用方法作为参数?

标签 ruby

我一直在阅读有关在 Ruby 中传递方法的不同方法,对我来说传递方法并在其上执行似乎是最干净的方法。但是,我认为我做错了。这有效:

def core
  myMethod = rand(2) > 0 ? meth1 : meth2
  myMethod.call("entered val")
end

def meth1
  Proc.new do | val |
    puts "meth1: #{val}"
  end
end

def meth2
  Proc.new do | val |
    puts "meth2: #{val}"
  end
end

但是看起来像下面这样感觉更自然(这不起作用):

def core
  myMethod = rand(2) > 0 ? meth1 : meth2
  myMethod("entered val")
end

def meth1
  puts "meth1: #{val}"
end

def meth2
  puts "meth2: #{val}"
end

如何格式化后者以使其正常工作?

最佳答案

您的第二个示例不起作用,因为您实际上是在三元运算符中从 core 调用 meth1meth2。您可以使用 Object#method方法从您的各个方法中创建一个 Method 对象实例。哇。 method 这个词用了很多。示例代码:

def core
  myMethod = rand(2) > 0 ? method(:meth1) : method(:meth2)
  myMethod.call("entered val")
end

def meth1(val)
  puts "meth1: #{val}"
end

def meth2(val)
  puts "meth2: #{val}"
end

core
# => "meth1: entered val" (or "meth2: entered val")

另一种选择是使用 Object#public_sendObject#send像这样:

def core
  myMethod = rand(2) > 0 ? :meth1 : :meth2
  send(myMethod, "entered val")
end

def meth1(val)
  puts "meth1: #{val}"
end

def meth2(val)
  puts "meth2: #{val}"
end

如果您的方法可见性允许,请首选 public_send

关于ruby - 如何在 Ruby 中调用方法作为参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30201419/

相关文章:

ruby-on-rails - 访问 Rails Assets 的相对路径

ruby-on-rails - 如何按 DESC 限制订单,然后按 ( :id)?

ruby - Rvm:无法卸载 bundle 程序 1.1.0

ruby-on-rails - 升级ruby和rails版本后has_many关系隐式转换错误

ruby-on-rails - 未定义的方法 `permit' 为 "1":String - RSPEC

ruby-on-rails - Sass::Engine.render 没有导入蓝图库...为什么?

ruby-on-rails - Mechanize 访问链接并获取页面标题

ruby-on-rails - 处理两个相似对象的最佳实践

ruby - 如何获取模式匹配目录Ruby中的特定文件

ruby-on-rails - rails - 重定向回来,除非前一页是艺术家页面