Модификатор доступа в Ruby

Я не могу понять это поведение. Пожалуйста, укажите мне подробный ответ. Я создал объект класса Parent:

class Parent
  private
  def name
    'Mommy'
  end
end
p = Parent.new

Это вызывает ошибку:

p.name
# => NoMethodError: private method `name' called for #<Parent:0x0000000182a360>

но следующее дает значение.

p.send(:name)
# => "Mommy" 

3 ответа

Решение

В Ruby частные методы не могут быть вызваны с явным получателем. - Это правило жестко закодировано. Если вы попытаетесь, МРТ будет возражать / жаловаться на то, что вы получили.

Но используя #sendВы не нарушаете правила, поэтому никаких возражений нет.

p.send(:name)Вы вызываете метод #send на pи одновременно передавая имя метода (:name) как символ, для вызова метода. Это действительно косвенный подход. Но в p.name, это прямой вызов метода #name на p, Вот и все отличия по поводу 2 подходов.

Нет, где это написано, вы не можете вызывать частные методы, но это написано, не с явным получателем, вы можете вызвать его.

В этом весь смысл private методы. В первой форме у вас есть явный получатель. Во втором классе вы не делаете.

send Метод может получить доступ к любому методу, будь то публичный, частный или защищенный. Если вы хотите метод, который уважает конфиденциальность методов, попробуйте public_send,

Другие вопросы по тегам