📜  Ruby 中的私有类

📅  最后修改于: 2022-05-13 01:55:01.530000             🧑  作者: Mango

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 (外部类方法)。如果外部类是私有的,则隐式和显式用户都无法访问它。因为在其类之外为私有类创建对象是不可能的。因此无法访问。

注意:外部类永远不能是私有的。