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

相關問題