15

对于 Ruby 中的方法,有什么类似于 javascript 的apply吗?

也就是说,如果某个方法被定义为采用几个参数,例如,some_method(a, b, c)我有一个包含三个项目的数组,我可以调用some_method.apply(the_context, my_array_of_three_items)吗?


编辑:(消除一些混乱):我不太关心通话的上下文,我只是想避免这种情况:

my_params = [1, 2, 3]
some_method(my_params[0], my_params[1], my_params[2])

相反,我很想知道是否有这样的事情

my_params = [1, 2, 3]
some_method.apply(my_params)
4

2 回答 2

16

有一些与 javascript 上下文最接近的绑定,还有一些未绑定的方法可以稍后绑定到要在其范围内调用的对象。

绑定必须更早地被捕获,并且它们允许在其上下文中从字符串评估代码。

使用方法提取器从任何对象捕获的解除绑定方法允许您稍后将其绑定到对象(请注意,它必须共享足够的接口才能使方法工作)并在其范围内调用它。

除非您想在 Ruby 中破解一些非常低级的东西,否则我不鼓励使用上述两种方法,而支持面向对象的解决方案。


编辑:

如果您只是想调用方法,而它的参数包含在数组中,请使用 splat 运算符:

a = [1, 2, 3]
method(*a)
于 2013-07-03T12:02:59.527 回答
3

您可以调用一个名称仅在运行时由sendon 方法知道的方法Class

更新

要将参数作为数组传递:

$ irb
2.0.0p195 :001 > class Foo
2.0.0p195 :002?>   def bar( a, b, c)
2.0.0p195 :003?>     puts "bar called with #{a} #{b} #{c}"
2.0.0p195 :004?>     end
2.0.0p195 :005?>   end
 => nil 
2.0.0p195 :006 > foo = Foo.new
 => #<Foo:0x000000022206a8> 
2.0.0p195 :007 > foo.bar( 1, 2, "fred" )
bar called with 1 2 fred
 => nil 
2.0.0p195 :009 > foo.send( :bar, *[1, 2, "jane"] )
bar called with 1 2 jane
 => nil 
2.0.0p195 :010 >
于 2013-07-03T12:06:05.807 回答