我无法理解这种行为。请指点我详细的答案。我创建了一个类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"
答案 0 :(得分:2)
这是private
方法的重点。在第一种形式中,您有一个明确的接收者。在第二种形式中,你不是。
答案 1 :(得分:1)
在Ruby中,无法使用显式接收器调用私有方法。 - 这是一个规则硬编码。如果你尝试,MRI会反对/抱怨你得到的东西。
但是使用#send
,你没有违反规则,因此没有异议。
p.send(:name)
,您在#send
上调用方法p
,同时将方法名称(:name
)作为符号传递给该方法。这确实是一种间接方法。但是在p.name
中,它是#name
上方法p
的直接方法调用。这就是两种方法的所有不同之处。
没有写入的地方,你不能调用私有方法,但它是写的,而不是显式接收器,你可以称之为。
答案 2 :(得分:0)
send
方法可以访问任何方法,无论是公共,私有还是受保护。如果你想要一种尊重方法的方法。隐私,请尝试public_send
。