伙计们,我正在学习红宝石,最近离开了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()
如果这是一个非常天真的问题,我很抱歉,我对红宝石很新,但很高兴学习。
答案 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
。实际上,两个变量都是实例变量。类上下文中声明的@names
是Foo
类对象的实例变量,方法内的@names
是Foo
类实例的实例变量。由于将有一个对象表示类型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