Ruby 中的私有类
Ruby 中私有、受保护和公共方法的概念与其他语言(如Java)有点不同。
在 Ruby 中,一切都与人在调用哪个类有关,因为类是 ruby 中的对象。
私人课程
当一个常量在 Ruby 中被声明为私有时,这意味着这个常量永远不能被显式接收者调用,私有常量只能被隐式接收者调用。因此,在 ruby 中,私有类可以在类内部定义为子类,并将它们声明为私有常量,这里这个私有类只能通过外部类访问。
句法:
private_constant: class
以下是公共类的示例:
# by default public
class Marvel
# by default public
class Guardians
def Quill
puts "Legendary outlaw"
end
def Groot
puts "I am Groot"
end
end
# by default public
class Avengers
def Tony
puts "I am Iron-man"
end
end
end
Marvel::Avengers.new.Tony
Marvel::Guardians.new.Quill
I am Iron-man
Legendary outlaw
在上面的示例中,由于子类Guardians 和 Avengers是公共的,隐式和显式用户都可以访问它。
- 看看私教课
例子 :# Ruby program of accessing private class # public class Marvel # Private class Guardians def Quill puts "Legendary outlaw" end def Groot puts "I am Groot" end end # public class Avengers def Tony puts "I am Iron-man" end end # making Guardians class private private_constant :Guardians end Marvel::Avengers.new.Tony # throws an error(NameError) Marvel::Guardians.new.Quill
输出:I am Iron-man main.rb:20:in `': private constant Marvel::Guardians referenced (NameError)
因此,在这里,如果我们查看代码,它们不是用于将类设为私有或公共的任何访问说明符关键字,但它们确实存在于 Ruby 中,但无法处理类。要将类设为私有,我们需要借助private_constant ,这会将任何对象、类或方法设为私有,显式用户将无法访问这些对象、类或方法。
- 如何通过外部类访问私有类。
# Ruby program a private class accessed through the outer-class. # public class Marvel # private class Guardians def Quill puts "Legendary outlaw" end def Groot puts "I am Groot" end end # private class Avengers def Tony puts "I am Iron-man" end end # outer-class method accessing private classes def fury Guardians.new.Groot Avengers.new.Tony end private_constant :Guardians private_constant :Avengers end # calls fury method in Marvel call. Marvel.new.fury # throws error as it is explicit accessing. Marvel::Avengers.new.Tony # throws error as it is explicit accessing. Marvel::Guardians.new.Quill
输出:I am Groot I am Iron-man main.rb:26:in `': private constant Marvel::Avengers referenced (NameError)
访问私有类(内部类)的唯一方法是通过其外部类。而私有类只能以内部类的形式存在。正如我们在上面的代码中看到的那样,我们通过创建Guardians.new 和 Avengers.new (私有类对象)并使用各自的对象Guardians调用各自的方法来访问Groot和 Tony (私有类方法)。 .new.Groot 和 Avengers.new.Tony (调用方法)来自fury (外部类方法)。如果外部类是私有的,则隐式和显式用户都无法访问它。因为在其类之外为私有类创建对象是不可能的。因此无法访问。
注意:外部类永远不能是私有的。