我有三个功能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 ')'
答案 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
,但这样可以访问私有方法和公共方法(根据使用情况,这可能是安全问题)
另一个选择是将a
和b
定义为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))