Модификатор доступа в 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
,