How to I make private class constants in Ruby

前端 未结 4 1209
执笔经年
执笔经年 2021-02-01 12:49

In Ruby how does one create a private class constant? (i.e one that is visible inside the class but not outside)

class Person
  SECRET=\'xxx\' # How to make clas         


        
相关标签:
4条回答
  • 2021-02-01 13:29

    Starting on ruby 1.9.3, you have the Module#private_constant method, which seems to be exactly what you wanted:

    class Person
      SECRET='xxx'.freeze
      private_constant :SECRET
    
      def show_secret
        puts "Secret: #{SECRET}"
      end
    end
    
    Person.new.show_secret
    # => "Secret: xxx"
    
    puts Person::SECRET
    # NameError: private constant Person::SECRET referenced
    
    0 讨论(0)
  • 2021-02-01 13:36

    You can also change your constant into a class method:

    def self.secret
      'xxx'
    end
    
    private_class_method :secret
    

    This makes it accessible within all instances of the class, but not outside.

    0 讨论(0)
  • 2021-02-01 13:36

    Well...

    @@secret = 'xxx'.freeze
    

    kind of works.

    0 讨论(0)
  • 2021-02-01 13:42

    Instead of a constant you can use a @@class_variable, which is always private.

    class Person
      @@secret='xxx' # How to make class private??
    
      def show_secret
        puts "Secret: #{@@secret}"
      end
    end
    Person.new.show_secret
    puts Person::@@secret
    # doesn't work
    puts Person.class_variable_get(:@@secret)
    # This does work, but there's always a way to circumvent privateness in ruby
    

    Of course then ruby will do nothing to enforce the constantness of @@secret, but ruby does very little to enforce constantness to begin with, so...

    0 讨论(0)
提交回复
热议问题