Вызов метода частного экземпляра из метода класса в 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