Ruby中的Access修饰符

时间:2014-04-03 13:10:15

标签: ruby private-methods

我无法理解这种行为。请指点我详细的答案。我创建了一个类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 个答案:

答案 0 :(得分:2)

这是private方法的重点。在第一种形式中,您有一个明确的接收者。在第二种形式中,你不是。

答案 1 :(得分:1)

在Ruby中,无法使用显式接收器调用私有方法。 - 这是一个规则硬编码。如果你尝试,MRI会反对/抱怨你得到的东西。

但是使用#send,你没有违反规则,因此没有异议。

p.send(:name),您在#send上调用方法p,同时将方法名称(:name)作为符号传递给该方法。这确实是一种间接方法。但是在p.name中,它是#name上方法p的直接方法调用。这就是两种方法的所有不同之处。

没有写入的地方,你不能调用私有方法,但它是写的,而不是显式接收器,你可以称之为

答案 2 :(得分:0)

send方法可以访问任何方法,无论是公共,私有还是受保护。如果你想要一种尊重方法的方法。隐私,请尝试public_send