Какая разница между private и protected?

Private делает возможным вызывать метод только как функцию, то есть единственный допустимый объект-получатель сообщения - это self. Private метод можно вызывать только из класса, где он определен, либо из классов-наследников.

  class Test
    def func
      return 99
    end
    def test(other)
      p func
      p other.func
    end
  end
  t1 = Test.new
  t2 = Test.new

  t1.test(t2)   #=> 99
  99

  # Now make 'func' private

  class Test
    private :func
  end

  t1.test(t2)   #=> 99

  -:7:in `test': private method `func' called for #<Test:0x401b49dc> (NameError)
          from -:22

Методы protected также могут вызываться из своего класса и классов-наследников, но их можно вызывать и как функции, и как методы с объектами-получателями сообщения. Например, следующий код:

  def <=>(other)
    age <=> other.age
  end

скомпилируется, если age - protected, но не private. Эти свойства позволяют контролировать доступ к внутренностям класса.

Вход для пользователей