Ruby中的类方法(相当于JAVA中的static)

时间:2012-02-02 21:38:45

标签: ruby-on-rails ruby

伙计们,我正在学习红宝石,最近离开了JAVA。在JAVA中,我可以使类的成员变量为static,并且该成员变量在类的实例中保持相同。我如何在ruby中实现同样的目标。我在我的红宝石课上做了类似的事情:

class Baseclass

  @@wordshash

end

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

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

class Baseclass

  @@wordshash

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

然后我可以像

一样使用它
#without making an instance
@hash = Baseclass.getwordhash()

如果这是一个非常天真的问题,我很抱歉,我对红宝石很新,但很高兴学习。

2 个答案:

答案 0 :(得分:12)

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

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视为静态变量。

答案 1 :(得分:7)

def self.getwordhash
  @@wordshash
end

使用Ruby and Rails Naming Conventions

class Baseclass

  @@words_hash = Hash.new

  def self.words_hash
    @@words_hash
  end
end