Ruby: Как связать несколько вызовов методов вместе с "send"
Должен быть встроенный способ сделать это, правильно?
class Object
def send_chain(arr)
o=self
arr.each{|a| o=o.send(a) }
return o
end
end
Ответ 1
Я просто наткнулся на это, и он действительно просит ввести:
def send_chain(arr)
arr.inject(self) {|o, a| o.send(a) }
end
Ответ 2
Нет, не встроенный способ сделать это. То, что вы сделали, просто и красноречиво, не говоря уже о опасном. Будьте осторожны при использовании.
По другой мысли, это может быть расширено и для принятия аргументов:
class Object
def send_chain(*args)
o=self
args.each do |arg|
case arg
when Symbol, String
o = o.send arg # send single symbol or string without arguments
when Array
o = o.send *arg # smash the inner array into method name + arguments
else
raise ArgumentError
end
end
return o
end
end
это позволит вам передать имя метода с его аргументами в массиве, например:
test = MyObject.new
test.send_chain :a_method, [:a_method_with_args, an_argument, another_argument], :another_method
Ответ 3
Основываясь на предыдущих ответах, если вам нужно передать аргументы каждому методу, вы можете использовать это:
def send_chain(arr)
Array(arr).inject(self) { |o, a| o.send(*a) }
end
Затем вы можете использовать метод следующим образом: