Сделайте методы экземпляра приватными во время выполнения
Мне нужно сделать некоторые методы экземпляра частными после регистрации этого объекта в другом объекте.
Я не хочу замораживать объект, потому что он должен оставаться редактируемым, только с меньшей функциональностью. И я не хочу отменить методы, так как они используются внутри.
Что мне нужно, это что-то вроде:
class MyClass
def my_method
puts "Hello"
end
end
a = MyClass.new
b = MyClass.new
a.my_method #=> "Hello"
a.private_instance_method(:my_method)
a.my_method #=> NoMethodError
b.my_method #=> "Hello"
Есть идеи?
3 ответа
Решение
Что публично, а что приватно, так это на класс. Но у каждого объекта может быть свой класс:
class Foo
private
def private_except_to_bar
puts "foo"
end
end
class Bar
def initialize(foo)
@foo = foo.dup
class << @foo
public :private_except_to_bar
end
@foo.private_except_to_bar
end
end
foo = Foo.new
Bar.new(foo) # => "foo"
foo.private_except_to_bar
# => private method `private_except_to_bar' called for #<Foo:0xb7b7e550> (NoMethodError)
Но блин. Рассмотрим эти альтернативы:
- Просто сделайте метод публичным.
- Исследуйте альтернативные проекты.
Вы можете вызвать метод private
на имя метода в любое время, чтобы сделать его закрытым:
>> class A
>> def m
>> puts 'hello'
>> end
>> end
=> nil
>> a = A.new
=> #<A:0x527e90>
>> a.m
hello
=> nil
>> class A
>> private :m
>> end
=> A
>> a.m
NoMethodError: private method `m' called for #<A:0x527e90>
from (irb):227
from /usr/local/bin/irb19:12:in `<main>'
или вне класса:
A.send :private, :m
class A
def test
puts "test"
end
def test2
test
end
end
a = A.new
class << a
private :test
end
a.test2 # works
a.test # error: private method