динамическая диспетчеризация ruby ​​с последовательным вызовом метода - PullRequest
0 голосов
/ 09 мая 2018

Я допускаю небольшую проблему при выполнении динамической диспетчеризации некоторого объекта в 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 Ответ

0 голосов
/ 09 мая 2018

Попробуйте это:

a = A.new
methods_ary = dynamic_string.split('.')
methods_ary.inject(a) { |r, m| r.send(m) }
...