Позвольте мне объяснить, Private
и protected
методы работают немного иначе в Ruby
, чем в большинстве других языков программирования.Предположим, у вас есть класс с именем Foo
и подкласс SubFoo
.В таких языках, как Java
, SubFoo
не имеет доступа к каким-либо закрытым методам, определенным Foo.Как видно из Решения, Ruby не позволяет скрыть методы класса от его подклассов.Таким образом, приват Ruby
работает как Java
protected
.
Предположим, что у вас есть два экземпляра класса Foo, a
и b
.На таких языках, как Java
, a
и b
, можно называть друг друга private methods
.В Ruby
для этого нужно использовать protected method
.В этом основное отличие методов private
и protected
в Ruby
.
class Foo
private
def pri
'hey I am private of Foo'
end
protected
def prot
'Hey I am protected of Foo'
end
end
Теперь подкласс Foo
class SubFoo < Foo
def call_pri_of_foo
pri
end
def call_prot_of_foo
prot
end
end
Теперь вызывая методы доступа в SubFoo
> sub_foo = SubFoo.new
=> #<SubFoo:0x00000002b56ad8>
> sub_foo.call_pri_of_foo
=> "hey I am private of Foo"
> sub_foo.call_prot_of_foo
=> "Hey I am protected of Foo"
До здесь;Кажется, нет никакой разницы
next_sub_foo = SubFoo.new
=> #<SubFoo:0x00000002b1a0b0>
def next_sub_foo.access_private(child_of_sub_foo)
child_of_sub_foo.pri
end
def next_sub_foo.access_protected(child_of_sub_foo)
child_of_sub_foo.prot
end
Теперь вызывая метод доступа
> next_sub_foo.access_private(sub_foo)
# => NoMethodError: private method `pri' called for #<SubFoo:0x00000002b56ad8>
, но он может получить доступ к защищенным методам своих братьев и сестер
> next_sub_foo.access_protected(sub_foo)
# => "Hey I am protected of Foo"
Вы также можетесм. блог @tenderlove
для более ясной картины http://tenderlovemaking.com/2012/09/07/protected-methods-and-ruby-2-0.html