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

时间:2015-06-29 13:11:45

标签: ruby parameter-passing

我有三个功能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 ')'

2 个答案:

答案 0 :(得分:2)

我建议使用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

希望这可以帮助您像我说的如果您更清楚地定义用例,可能会有更好的方法来处理问题。

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

另请注意,您可以使用Object#send,但这样可以访问私有方法和公共方法(根据使用情况,这可能是安全问题)

另一个选择是将ab定义为lambdas或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   

答案 1 :(得分:0)

有一个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))