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

在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 |

我一直在阅读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调用meth1和meth2。您可以使用该方法从各个方法中生成一个方法对象实例。哇!这是大量使用单词的方法。示例代码:

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")
另一种选择是使用或类似:


如果方法可见性允许,请选择public\u send。

您的第二个示例不起作用,因为您实际上是在三元运算符中从core调用meth1和meth2。您可以使用该方法从各个方法中生成一个方法对象实例。哇!这是大量使用单词的方法。示例代码:

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")
另一种选择是使用或类似:


如果您的方法可见性允许,请选择public\u send。

与其扔掉代码,不如解释为什么应该这样做。然后OP将能够了解该做什么以及为什么要做。我认为,对于最近提出的问题,提供一个快速的、仅使用代码的答案,然后在时间允许的情况下,以长格式解释作为编辑,是有价值的。当然,欢迎您提出异议。与其扔掉代码,不如解释为什么应该这样做。然后OP将能够了解该做什么以及为什么要做。我认为,对于最近提出的问题,提供一个快速的、仅使用代码的答案,然后在时间允许的情况下,以长格式解释作为编辑,是有价值的。当然,欢迎你提出异议。