Javascript-стиль `применяется` в Ruby?

Для методов в Ruby есть что-то похожее на javascript apply?

То есть, если какой-то метод был определен для принятия нескольких параметров, скажем, some_method(a, b, c), и у меня есть массив из трех элементов, могу ли я вызвать some_method.apply(the_context, my_array_of_three_items)?


EDIT: (чтобы устранить некоторую путаницу): Мне все равно, о контексте вызова, я просто хочу этого избежать:

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)

Ответы

Ответ 1

Существуют привязки, которые являются ближайшими аналогами контекста javascript, и существуют несвязанные методы, которые могут быть позже связанный с объектом, который должен быть вызван в нем.

Привязки должны быть ранее сняты, и они позволяют оценивать код из строки в этом контексте.

Отвязать метод, захваченный с любого объекта с помощью экстрактора методов, позволяет вам позже bind к объекту (обратите внимание, что он должен обладать достаточным интерфейсом для работы метода) и вызвать его в этой области.

Если вы не хотите взломать некоторые вещи очень низкого уровня в Ruby, я бы отговорил использовать оба выше в пользу объектно-ориентированного решения.


EDIT:

Если вы просто хотите вызвать метод, в то время как его аргументы содержатся в массиве, используйте оператор splat:

a = [1, 2, 3]
method(*a)

Ответ 2

Вы можете вызвать метод, имя которого известно только во время выполнения методом send на 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 >