如何在 Ruby 中将多个函数作为参数传递?
How to pass multiple function as argument in Ruby?
我有三个函数 A
、B
和 C
。我需要将 A
和 B
传递给 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 方法的访问权限(这可能是一个安全问题,具体取决于使用情况)
另一种选择是将 a
和 b
定义为 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
我有三个函数 A
、B
和 C
。我需要将 A
和 B
传递给 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 方法的访问权限(这可能是一个安全问题,具体取决于使用情况)
另一种选择是将 a
和 b
定义为 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