2013-05-04 64 views
0

我对Ruby有点新,只是被要求在这里和那里维护一些旧的,没有记录的代码。 我有一个基类在红宝石,我把一个哈希类变量。类级变量的行为像一个实例变量,而不是

@@projects = Hash.new 

而我希望我的派生类通过一个方法(传递参数)添加到它。 问题是,似乎每个派生类都有自己的散列副本,而不是访问它的单个“静态”版本。

有人可以帮忙吗?

class Base 
    @@projects = Hash.new 
    def AddSomething key, value 
     @@projects[key] = value 
    end 
end 

class Derived < Base 
    def initialize 
     ... 
     AddSomething key, value 
     ... 
    end 
end 

所以,上面的代码示例中,每次我添加一个值到@@项目在AddSomething函数的散列的大小/长度始终为1,它永远不会增长。它的行为就好像它是一个不是我想要的实例变量。

任何想法?我被困在这里。

回答

1

在Derived的初始化程序中隐藏在...后面的代码中可能有些错误。下面的代码为我工作得很好:

irb(main):032:0> class Base 
irb(main):033:1> @@projects = {} 
irb(main):034:1> def add(k, v) 
irb(main):035:2>  @@projects[k] = v 
irb(main):036:2> end 
irb(main):037:1> end 
=> nil 
irb(main):038:0> class Derived < Base 
irb(main):039:1> def initialize(k, v) 
irb(main):040:2>  add(k, v) 
irb(main):041:2> end 
irb(main):042:1> end 
=> nil 
irb(main):048:0> Derived.send(:class_variable_get, :@@projects) 
=> {} 
irb(main):049:0> Derived.new(1,2) 
=> #<Derived:0xb777be6c> 
irb(main):050:0> Derived.send(:class_variable_get, :@@projects) 
=> {1=>2} 
irb(main):051:0> Derived.new(3,4) 
=> #<Derived:0xb7772fb0> 
irb(main):052:0> Derived.send(:class_variable_get, :@@projects) 
=> {1=>2, 3=>4} 

UPD:让我换种方式:

irb(main):053:0> class Base 
irb(main):054:1> @@projects = {} 
irb(main):055:1> def add(k, v) 
irb(main):056:2>  @@projects[k] = v 
irb(main):057:2>  p @@projects 
irb(main):058:2> end 
irb(main):059:1> end 
=> nil 
irb(main):060:0> class Derived < Base 
irb(main):061:1> def initialize(k, v) 
irb(main):062:2>  add(k, v) 
irb(main):063:2> end 
irb(main):064:1> end 
=> nil 
irb(main):065:0> 
irb(main):066:0* Derived.new(1, 2) 
{1=>2} 
=> #<Derived:0xb77ae40c> 
irb(main):067:0> Derived.new(:a, :b) 
{:a=>:b, 1=>2} 
=> #<Derived:0xb77a0500> 
irb(main):068:0> Derived.new(:c, :d) 
{:a=>:b, :c=>:d, 1=>2} 
=> #<Derived:0xb779ace0> 
+0

wo,等一下。这是什么东西发送?看起来你正在反思某些东西,其语法看起来像是Ruby的一个深奥秘密。 – 2013-05-04 12:14:13

+0

查看更新。 – DNNX 2013-05-04 12:21:05

+0

啊,但我使用的是字符串,而不是这些:thingies(什么都叫你......名字?) – 2013-05-04 12:40:04

0

看起来好像Derived#initialize没有任何参数。 keyvalue传递给AddSomething从哪里来?如果它们是恒定的,那么当然@@projects仍然具有长度1,因为您将继续向散列添加相同的keyvalue

+0

变量键和值在各种代码初始化方法产生的。初始化方法的参数与此处的问题无关。我已经调试了key和value的值,它们是我期望的:唯一的关联对。 – 2013-05-04 10:52:38