【问题标题】:Why can I call private methods via Object#send, but not directly call said methods?为什么我可以通过 Object#send 调用私有方法,但不能直接调用所述方法?
【发布时间】:2017-10-18 10:31:27
【问题描述】:

为什么我可以通过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"

【问题讨论】:

  • 在设计接口时,可以使用私有方法,表示该方法不稳定,不应该被对象直接使用。
  • 它没有保持对send方法的完全使用,并发出警告消息,但这里是一个覆盖send方法以防止访问私有方法的示例:link跨度>
  • 您将需要覆盖很多东西...stackoverflow.com/questions/5349624/…您可以对调用者进行廉价检查...
  • FWIW,你可能有更好的运气“无论如何可以可靠地防止对象能够调用某些方法?”作为问题的标题,并编辑您的问题以符合主题。当然,那很可能只是stackoverflow.com/questions/20639857/…的骗子。就像现在一样,它是广泛的和基于意见的......
  • 最好还是可以调用它们,否则受阻的程序员只会将代码复制/粘贴到新位置。那么你会有两个问题......

标签: ruby


【解决方案1】:
  • 为什么我可以通过 Object#send(:private_method) 调用私有方法?

仔细看看你做了什么:

me.send(:private_say_hi)

private_say_hi 方法在任何地方都没有以如下形式调用:

me.private_say_hi

这就是为什么。不是很明显吗?

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

正如定义所说。避免被显式接收者调用。

  • 有没有办法可靠地阻止对象调用某些方法?

根据需要使用undefundef_methodremove_method

【讨论】:

    猜你喜欢
    • 2010-10-27
    • 1970-01-01
    • 2011-01-31
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    相关资源
    最近更新 更多