Вызов метода частного экземпляра из метода класса в Ruby

Можно ли создать метод частного экземпляра, который может быть вызван методом класса?

class Foo
  def initialize(n)
    @n = n
  end
  private # or protected?
  def plus(n)
    @n += n
  end
end

class Foo
  def Foo.bar(my_instance, n)
    my_instance.plus(n)
  end
end

a = Foo.new(5)
a.plus(3) # This should not be allowed, but
Foo.bar(a, 3) # I want to allow this

Извините, если это довольно элементарный вопрос, но я не смог Google найти способ решения.

Ответы

Ответ 1

Использование частных или защищенных действительно не так много делает в Ruby. Вы можете позвонить по любому объекту и использовать любой способ, который он имеет.

class Foo
  def Foo.bar(my_instance, n)
    my_instance.send(:plus, n)
  end
end

Ответ 2

Вы можете сделать это, как показал Самуил, но он действительно обходит проверки OO...

В Ruby вы можете отправлять частные методы только на одном и том же объекте и защищаться только объектами одного класса. Статические методы находятся в мета-классе, поэтому они находятся в другом объекте (а также в другом классе), поэтому вы не можете делать так, как вы хотели бы использовать личный или защищенный.

Ответ 3

Вы также можете использовать instance_eval

class Foo
  def self.bar(my_instance, n)
    my_instance.instance_eval { plus(n) }
  end
end