【问题标题】:Create module variables in Ruby在 Ruby 中创建模块变量
【发布时间】:2011-08-07 02:55:44
【问题描述】:

有没有办法在 Ruby 中的模块中创建一个行为类似于类变量的变量?我的意思是,它可以在不初始化模块实例的情况下被访问,但它可以被更改(不像模块中的常量)。

【问题讨论】:

    标签: ruby module class-variables


    【解决方案1】:

    Ruby 原生支持模块中的类变量,因此您可以直接使用类变量,而不是一些代理或伪类变量:

    module Site
      @@name = "StackOverflow"
    
      def self.setName(value)
        @@name = value
      end
    
      def self.name
        @@name
      end
    end
    
    Site.name            # => "StackOverflow"
    Site.setName("Test")
    Site.name            # => "Test"
    

    【讨论】:

    • +1 实际上,我一直认为“类变量”一词具有误导性。类是模块的特例,类变量可以在模块上定义。它们应该被称为模块变量。
    • @sawa:这有点误导,但它是 Ruby 本身使用的:defined?(@@foo) => "class variable"
    • 或者它们可以称为静态字段。看起来就是这样。
    • @coreyward 嘿,我的错误。为什么需要两个“@@”类变量?它不被认为是代码异味吗,尤其是如果将类扩展为使用类变量?我正在对此进行测试,我意识到我可以从单个 @ 实例变量中获得相同的结果。使用类变量是否有特定原因?感谢您的回复。
    • 为什么最后会有不同的调用:T.getT::get
    【解决方案2】:

    您也可以在模块定义中初始化值:

    module MyModule
      class << self
        attr_accessor :my_variable
      end
      self.my_variable = 2 + 2
    end
    
    p MyModule.my_variable
    

    【讨论】:

      【解决方案3】:

      您可以在模块中设置类实例变量。

      module MyModule
         class << self; attr_accessor :var; end
      end
      
      MyModule.var = 'this is saved at @var'
      
      MyModule.var    
      => "this is saved at @var"
      

      【讨论】:

      • +1,但我只是强调类实例变量与类变量不同。
      【解决方案4】:

      如果您不需要在实例中调用它,您可以简单地在模块主体中使用实例变量。

      module SomeModule
        module_function
        def param; @param end
        def param= v; @param = v end
      end
      
      SomeModule.param
      # => nil
      SomeModule.param = 1
      SomeModule.param
      # => 1
      

      实例变量@param 将属于模块SomeModule,它是Module 类的一个实例。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-21
        相关资源
        最近更新 更多