Мне нравится простота send()
, хотя есть одна плохая вещь в том, что она может быть использована для доступа к рядовым. Проблема все еще остается решением ниже, но, по крайней мере, тогда она явно указана, и читатель может видеть, какие методы должны быть перенаправлены. Первый просто использует делегирование, а второй использует более динамичный способ определения методов на лету.
require 'forwardable'
class A
extend Forwardable
def_delegators :@myinstance, :foo, :bar
class B
def foo
puts 'foo called'
end
def bar
puts 'bar called'
end
def quux
puts 'quux called'
end
def bif
puts 'bif called'
end
end
def initialize
@myinstance = B.new
end
%i(quux bif).each do |meth| # note that only A#quux and A#bif are defined dynamically
define_method meth do |*args_but_we_do_not_have_any|
@myinstance.send(meth)
end
end
end
a = A.new
a.foo
a.bar
a.quux
a.bif