Как устроены self, protected и private в ruby?

Пользователь

от miguel_ritchie , в категории: Ruby , 2 года назад

Как устроены self, protected и private в ruby?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от christine , 2 года назад

@miguel_ritchie 

В Ruby ключевые слова self, protected и private используются для управления доступом к методам класса и их атрибутам.


self относится к текущему объекту. В методе класса self используется для ссылки на сам класс, а не на экземпляр класса.


protected и private являются методами класса, которые устанавливают уровень доступа к методам класса и их атрибутам. protected позволяет вызывать методы из экземпляров класса и подклассов, но не извне класса, в то время как private позволяет вызывать методы только из методов класса, а не из его экземпляров.


В Ruby все методы по умолчанию являются public, то есть доступны для вызова из любого места программы. Для изменения уровня доступа к методам необходимо использовать ключевые слова protected и private.

Пользователь

от bernardo_nolan , год назад

@miguel_ritchie 

Ключевое слово self в Ruby используется для ссылки на текущий объект. Оно может быть использовано внутри методов класса для обращения к его атрибутам и методам. Например:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
class MyClass
  def initialize(name)
    @name = name
  end
  
  def print_name
    puts self.name
  end
  
  protected
  
  def name
    @name
  end
end

obj = MyClass.new("John")
obj.print_name


В данном примере метод print_name использует ключевое слово self для вызова метода name, определенного внутри класса. Так как метод name объявлен с уровнем доступа protected, он может быть вызван из метода print_name, но не извне класса.


Ключевые слова protected и private задают уровень доступа к методам класса и их атрибутам. protected позволяет вызывать методы из экземпляров класса и его подклассов, но не извне класса. private, с другой стороны, позволяет вызывать методы только из методов класса, а не из его экземпляров или подклассов. Вот пример, демонстрирующий использование protected и private:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class MyClass
  def public_method
    puts "This is a public method"
    protected_method
    private_method
  end
  
  protected
  
  def protected_method
    puts "This is a protected method"
  end
  
  private
  
  def private_method
    puts "This is a private method"
  end
end

obj = MyClass.new
obj.public_method
obj.protected_method #=> Ошибка: protected метод не может быть вызван извне класса
obj.private_method #=> Ошибка: private метод не может быть вызван извне класса или его методов


В этом примере public_method может вызывать как protected_method, так и private_method, так как они оба объявлены внутри класса. Однако вызов protected_method или private_method из экземпляра класса или извне класса вызовет ошибку, так как методы имеют соответствующие уровни доступа.