gpt4 book ai didi

ruby - 为什么在 Ruby 中可以显式调用私有(private)类方法?

转载 作者:太空宇宙 更新时间:2023-11-03 17:03:26 25 4
gpt4 key购买 nike

正如我们所知,在 ruby​​ 中不能使用显式接收器调用私有(private)方法。但是当我定义一个类时,我可以通过类本身调用私有(private)类方法。

例如:

class A
private
def self.test
puts "hello,world!"
end
end

A.test => hello,world!
A.new.test NoMethodError: private method `test' called for #<A:0x007f80b91a10f8>

这与私有(private)的定义相矛盾。谁能告诉我原因。提前致谢!

最佳答案

private 只影响实例方法。要创建私有(private)类方法,请使用 private_class_method:

class A
private_class_method def self.test
puts "hello,world!"
end
end

class A
def self.test
puts "hello,world!"
end
private_class_method :test
end

编辑:另一种方法是在元类上定义方法——它们将表现为类方法。

class A
class << self
private
def test
puts "hello,world!"
end
end
end

不幸的是,没有 protected_class_method 这样的东西 - 但最后一个选项给了我们如何去做的提示:

class A
class << self
protected
def test
puts "hello,world!"
end
end
end

但请注意,它只能从子类的类方法中调用:

class B < A
def self.test_class
A.test
end
def test_instance
A.test
end
end

B.test_class
# => hello,world!
B.new.test_instance
# => `test_instance': protected method `test' called for A:Class (NoMethodError)

关于ruby - 为什么在 Ruby 中可以显式调用私有(private)类方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30725562/

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