Динамическая диспетчеризация ruby с последовательным вызовом метода
Я допускаю небольшую проблему при выполнении динамической отправки на некотором объекте в Ruby
Я хочу вызвать метод, но я могу получить его только с помощью нескольких вызовов
т.е. dynamic_string = 'my_object.other_object.this_method'
Я хочу позвонить this_method
на other_object
что я получил от my_object.other_object
Вот мой MCVE:
class A
attr_reader :b
def initialize
@b = B.new
end
end
class B
def this
'i want this dynamically'
end
end
a = A.new
a.b.this # => 'i want this dynamically'
dynamic_string = 'b.this'
a.send(dynamic_string) # => error below
NoMethodError: undefined method 'b.this' for #<A:0x000000025598b0 @b=#<B:0x00000002559888>>
Из того, что я понимаю, метод send пытается вызвать литеральный метод b.this
на a
объект.
Я знаю, что для того, чтобы это работало, я должен делать тезисы подряд:
a.send('b').send('this')
но я не могу понять, как сделать это динамически
Как я могу добиться последовательных динамических звонков? (в этом примере мне нужно только 2 звонка, но я хотел бы, если возможно, более общее решение, которое будет работать для каждого количества звонков)
1 ответ
Попробуй это:
a = A.new
methods_ary = dynamic_string.split('.')
methods_ary.inject(a) { |r, m| r.send(m) }