类级变量的作用类似于实例变量

时间:2013-05-04 10:20:09

标签: ruby

我对ruby有点新鲜,只是被要求在这里和那里维护一些旧的,未记录的代码。 我在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函数中向@@ projects添加值时,哈希的大小/长度始终为1,它永远不会增长。它就好像它是一个不是我想要的实例变量。

有什么想法吗?我在这里难过。

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

看起来Derived#initialize没有任何争论。传递给key的{​​{1}}和value来自何处?如果它们不变,那么当然AddSomething仍然是长度为1,因为您会继续向哈希添加相同的@@projectskey