gpt4 book ai didi

ruby - 为什么 Ruby 既有私有(private)方法也有 protected 方法?

转载 作者:数据小太阳 更新时间:2023-10-29 06:17:16 25 4
gpt4 key购买 nike

在我阅读之前this article ,我认为 Ruby 中的访问控制是这样工作的:

  • public - 可以被任何对象访问(例如 Obj.new.public_method)
  • protected - 只能从对象本身以及任何子类中访问
  • private - 与 protected 相同,但子类中不存在该方法

但是,看起来 protectedprivate 的行为是一样的,只是你不能调用 private 方法显式接收器(即 self.protected_method 有效,但 self.private_method 无效)。

这有什么意义?什么情况下您不希望使用显式接收器调用您的方法?

最佳答案

protected 方法可以被定义类或其子类的任何实例调用。

private 方法只能从调用对象中调用。您不能直接访问另一个实例的私有(private)方法。

这是一个快速的实际例子:

def compare_to(x)
self.some_method <=> x.some_method
end

some_method 在这里不能是private。它必须受到 protected 因为您需要它来支持显式接收器。您的典型内部辅助方法通常可以是 private,因为它们永远不需要这样调用。

请务必注意,这与 Java 或 C++ 的工作方式不同。 Ruby 中的 private 类似于 Java/C++ 中的 protected,子类可以访问该方法。在 Ruby 中,无法像在 Java 中使用 private 那样限制从其子类访问方法。

无论如何,Ruby 中的可见性在很大程度上是一种“推荐”,因为您始终可以使用 send 访问方法:

irb(main):001:0> class A
irb(main):002:1> private
irb(main):003:1> def not_so_private_method
irb(main):004:2> puts "Hello World"
irb(main):005:2> end
irb(main):006:1> end
=> nil

irb(main):007:0> foo = A.new
=> #<A:0x31688f>

irb(main):009:0> foo.send :not_so_private_method
Hello World
=> nil

关于ruby - 为什么 Ruby 既有私有(private)方法也有 protected 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3534449/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com