【问题标题】:Class method in Ruby (equivalent of static in JAVA)Ruby 中的类方法(相当于 JAVA 中的静态方法)
【发布时间】:2012-02-25 14:01:08
【问题描述】:

伙计们,我正在学习 ruby​​,最近从 JAVA 搬来。在 JAVA 中,我可以将类的成员变量设为静态,并且该成员变量在类的实例中将保持不变。我如何在红宝石中达到同样的效果。我在我的红宝石课上做了这样的事情:

class Baseclass

  @@wordshash

end

到目前为止,这似乎在我测试它时达到了目的,即@@wordhash 在 Baseclass 的实例中保持不变。我的理解是否正确。

另外,我想在类中有一个成员方法,它等效于 JAVA 中的静态方法(我不需要类的实例来访问它)。我怎样才能做到这一点?例如,我想在基类中有一个方法,如 getwordshash(),它返回 @@wordshash,并且该方法的用户不必创建 Baseclass() 的实例。所以像这样:

class Baseclass

  @@wordshash

  #static or class method
  def getwordhash()
    return @@wordshash
  end
end

然后我可以像这样使用它

#without making an instance
@hash = Baseclass.getwordhash()

如果这是一个非常幼稚的问题,我深表歉意,我对 ruby​​ 真的很陌生,但学习起来很兴奋。

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:
    def self.getwordhash
      @@wordshash
    end
    

    Ruby and Rails Naming Conventions:

    class Baseclass
    
      @@words_hash = Hash.new
    
      def self.words_hash
        @@words_hash
      end
    end
    

    【讨论】:

    • 其实convention通常没有类型。应该是@@words 而不是@@words_hash
    【解决方案2】:

    使用类变量作为静态存储在子类中会产生意想不到的后果。您可以通过在类级别声明一个实例变量来轻松实现静态存储。

    class Foo
    
      # initialize a static variable
      @names = ['Tom', 'Dick', 'Harry']
    
      # class method (notice the self. prefix
      def self.names
        @names
      end
    
      # instance methods
    
      def names
        @names
      end
    
      def names=val
        @names = val
      end
    
    end
    

    让我们打印静态名称

    >> Foo.names
    => ["Tom", "Dick", "Harry"]
    

    让我们打印实例变量

    >> f = Foo.new
    >> f.names
    => nil
    

    让我们设置实例变量并尝试再次打印它

    >> f.names=["Bob", "Danny"]
    => ["Bob", "Danny"]
    
    >> f.names
    => ["Bob", "Danny"]
    

    让我们再次打印静态变量

    >> Foo.names
    => ["Tom", "Dick", "Harry"]
    

    我松散地使用术语static。实际上,这两个变量都是实例变量。在类上下文中声明的@namesFoo 类对象的实例变量,方法内部的@namesFoo 类实例的实例变量。由于将有一个对象代表Foo 类型,我们可以认为在类上下文中声明的@names 是一个静态变量。

    【讨论】:

    • 是否可以使用一些简写的变体:attr_accessor 来访问这些准类实例变量?
    • @DennisHodapp 你试过使用cattr_accessormattr_accessor 方法吗?
    • 不,我没有,但似乎这些访问器是 rails 的扩展,我宁愿不必为 Ruby 应用程序导入它们。
    • @DennisHodapp,该功能不需要整个导轨。你只需要 ActiveSupport gem(rubygems.org/gems/activesupport)。这是使用attr_accessor 执行相同操作的另一种方法:stackoverflow.com/a/895752/163203
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    • 2022-12-12
    • 2016-12-21
    • 2020-01-18
    • 1970-01-01
    相关资源
    最近更新 更多