0

我对 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,它永远不会增长。它就像一个实例变量,这不是我想要的。

有任何想法吗?我被难住了。

4

2 回答 2

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>
于 2013-05-04T12:08:35.800 回答
0

看起来Derived#initialize不需要任何论据。keyvalue传递AddSomething来自哪里?如果它们是恒定的,那么当然@@projects长度仍然为 1,因为您将继续将相同的key和添加value到散列中。

于 2013-05-04T10:45:55.043 回答