Сделайте методы экземпляра частными во времени выполнения

Я должен сделать некоторые методы экземпляра частными после регистрации того объекта в другом объекте.

Я не хочу замораживать объект, потому что это должно остаться доступным для редактирования, только с меньшей функциональностью. И я не хочу к undef методы, так как они используются внутренне.

То, в чем я нуждаюсь, является чем-то как:

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"

Какие-либо идеи?

5
задан Andrew Grimm 27 March 2012 в 23:07
поделиться

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)

Но фу. Рассмотрим следующие альтернативы:

  • Просто сделайте метод общедоступным.
  • Изучите альтернативные конструкции.
4
ответ дан 18 December 2019 в 09:49
поделиться

Вы можете назвать метод 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
8
ответ дан 18 December 2019 в 09:49
поделиться
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
5
ответ дан 18 December 2019 в 09:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: