?

Log in

Thu, Sep. 27th, 2012, 09:20 pm
sontar:

Ещё вопрос по метапрограммированию.
Возьмём такой код (нам нужно вызвать метод объекта извне по его имени):
class Foo
  def bar
    # ...
  end
end

foo = Foo.new
method_name = :bar
foo.method(method_name).call


обычно такое прокатит, но если переопределить метод method

class Foo
  def bar
    # ...
  end
  def method
  end
end


то нет

собственно, вопрос: как вызвать метод объекта не используя методы этого объекта? Ну типа может есть в языке что-то вроде
instance_method(foo, :bar)
?

Thu, Sep. 27th, 2012 10:50 am (UTC)
sontar

можно сделать так:

class Foo
  def bar
    @c = 123
  end
  def baz
    bar
    @c
  end
  def method
    
  end
end

foo = Foo.new
baz = Foo.instance_method :bar
p baz.bind(foo).call


но неизвестно сколько при этом утечёт памяти.

лучше воспользоваться методом BasicObject.__send__

class Foo
  def bar
    @c = 123
  end
  def baz
    bar
    @c
  end
end

foo = Foo.new
p foo.__send__(:baz)


при переопределении же метода __send__ MRI ругается, что уже неплохо

всем спасибо за ответы
(Deleted comment)

Thu, Sep. 27th, 2012 10:54 am (UTC)
sontar

уже догнал, спс