如何在 Ruby 中将多个函数作为参数传递?

How to pass multiple function as argument in Ruby?

我有三个函数 ABC。我需要将 AB 传递给 C。我该怎么做?

def A a
end

def B b
end

def C( &f1, &f2 ) #  syntax error, unexpected ',', expecting ')'
  f1.call 123
  f2.call 234
end

def C( f1, f2 ) # this one ok
  f1.call 123
  f2.call 234
end

C( &A, &B) # syntax error, unexpected ',', expecting ')'

有一个method方法可以将函数转换为方法,所以我们可以这样做:

def A a
end

def B b
end

def C( f1, f2 ) # this one ok
  f1.call 123
  f2.call 234
end

C( method(:A), method(:B))

我建议使用 Object#public_send 来执行此操作,尽管我认为如果您要更清楚地定义它,可能有更好的方法来处理您的情况。

另外,只有常量应该大写,方法应该以小写蛇形定义。

示例:

#puts used for clarification purposes
class SomeClass
  def a(val)
    puts "method a called with #{val}"
  end
  def b(val)
    puts "method b called with #{val}"
  end
  def c (f1,f2)
   public_send(f1,123)
   public_send(f2,234)
  end
end

用法

s = SomeClass.new
s.c(:a,:b)
#method a called with 123
#method b called with 234
#=> nil

希望这对您有所帮助,就像我说的那样,如果您更清楚地定义用例,可能并且很可能有更好的方法来处理问题。

注意:上面的代码在main:Object的上下文中直接输入到irb中是不会起作用的。相反,它会通知您为 main:Object 调用了私有方法。这是因为在 irb 中定义方法时,它在 main 的上下文中被私有化。

另请注意,您可以使用 Object#send,但这将提供对私有和 public 方法的访问权限(这可能是一个安全问题,具体取决于使用情况)

另一种选择是将 ab 定义为 lambda 或 Procs,例如

a= ->(val) {puts "method a called with #{val}"}
b= ->(val) {puts "method b called with #{val}"}
def c(f1,f2)
  f1.call(123)
  f2.call(234)
end
c(a,b)
#method a called with 123
#method b called with 234
#=> nil