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 >