gpt4 book ai didi

ruby - private 不阻止调用模块中的函数 (Ruby)

转载 作者:数据小太阳 更新时间:2023-10-29 08:26:57 24 4
gpt4 key购买 nike

module Test
private
def secret
puts '<>'
end
end

include Test

secret #it works
Test.secret #it fails: "private method `secret' called for Test:Module (NoMethodError)"

private 以这种方式工作是否有一些设计原因?我知道我可以使用

      private_class_method :secret

也阻止第一个调用,但我想知道模块中私有(private)的任何用例。

最佳答案

开始理解什么是 Ruby 中的私有(private)方法的一个通常好的方法是将其视为只能隐式调用的方法。这意味着不应显式指定接收该方法的对象:

my_private_method       # Implicit call, this is OK.
self.my_private_method # Explicit call, this won't work.

使用这种简单的方法,您可以(在一定程度上)确保私有(private)方法不能在 self 以外的对象上调用。例如:

my_private_method                # Calling private method on self, this is OK.
other_object.its_private_method # Calling other object's private method, this won't work.

现在,当您有一个定义私有(private)方法的模块时,您首先需要将它包含在某处以便能够使用该方法。您在示例中所做的是将模块包含在最顶层。当你这样做时,Ruby 将模块包含在 Object class 中。 .这意味着您的 secret 方法现在是所有 Ruby 对象的私有(private)方法,并且由于所有 Ruby 对象都将具有私有(private) secret 方法,您可以隐式地 现在从程序中的任何地方调用它:

secret         #=> "<>"
class MyClass
secret
end #=> "<>"

给你一个想法,你的 secret 方法将表现得非常像 puts 方法(也是 Object 的私有(private)方法之一)方法)。您不能在对象上显式调用 puts,但可以在程序中的任何位置使用它。这就是您希望在模块中使用私有(private)方法的原因之一。

另一个原因可能是只实现包含模块或类的方法,例如:

module M
private
def my_private_method
"This is private."
end
end

class C
include M
def my_public_method
"<#{my_private_method}>"
end
end

c = C.new
c.my_public_method #=> "<This is private.>"
c.my_private_method #=> This won't work.

关于ruby - private 不阻止调用模块中的函数 (Ruby),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27593390/

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