为什么我可以通过Object#send调用私有方法,但不能直接调用所述方法?

时间:2017-10-17 23:06:39

标签: ruby

为什么我可以通过Object#send(:private_method)调用私有方法?

如果不阻止直接调用某些方法,Ruby的private关键字的目的是什么?

是否有可靠的防止对象调用某些方法?

class Person
  def say_hi
    "hi"
  end

  private
  def private_say_hi
    "private hi"
  end
end

me = Person.new
me.say_hi
#=> "hi"

me.private_say_hi
#Error: private method `private_say_hi' called for #<Person:0x00558df4b79a08>

me.send(:private_say_hi)
#=> "private hi"

1 个答案:

答案 0 :(得分:2)

  • 为什么我可以通过Object#send(:private_method)?
  • 调用私有方法

仔细看看你做了什么:

me.send(:private_say_hi)

在任何地方,方法private_say_hi都以以下形式调用:

me.private_say_hi

这就是原因。是不是很明显?

  • Ruby的私有关键字的目的是什么,如果不是为了防止直接调用某些方法?

正如定义所说。避免使用显式接收器调用。

  • 无论如何都可以可靠地阻止对象调用某些方法吗?

根据您的需要使用undefundef_methodremove_method