我对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,它永远不会增长。它就好像它是一个不是我想要的实例变量。
有什么想法吗?我在这里难过。
答案 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,因为您会继续向哈希添加相同的@@projects
和key
。