出于学术原因,我想让Ruby类的实例像哈希一样。
目标
虽然存在一些讨论,但我尝试了那里的内容(1,2)但没有成功。让我知道我做错了什么。谢谢!
class MyClass
attr_accessor :my_hash
def initialize(hash={})
@my_hash = hash
end
def [](key)
my_hash[key]
end
def set_prop(key, value)
myhash[key] = value
end
end
test = myClass.new({:a => 3}) #=> #<MyClass:0x007f96ca943898 @my_hash={:a=>3}>
test[:a] #=> 3
test[:b] = 4 #=> NameError: undefined local variable or method `myhash' for #<MyClass:0x007f96ca9d0ef0 @my_hash={:a=>3}>
答案 0 :(得分:6)
您声明了set_prop
,但您在测试中使用[]=
。你的意思是这个吗?
class MyClass
attr_accessor :my_hash
def initialize(hash={})
@my_hash = hash
end
def [](key)
my_hash[key]
end
def []=(key, value)
my_hash[key] = value
end
end
test = MyClass.new({:a => 3}) # success
test[:a] # success
test[:b] = 4 # success
test.my_hash # => {:a=>3, :b=>4}
答案 1 :(得分:2)
您应该将其写为test = MyClass.new({:a => 3})
,以下代码应该有效。
class MyClass
attr_accessor :my_hash
def initialize(hash={})
@my_hash = hash
end
def [](key)
@my_hash[key]
end
def []=(key,val)
@my_hash[key]=val
end
def set_prop(key, value)
@myhash[key] = value
end
end
test = MyClass.new({:a => 3})
test[:a]
test[:b]= 4
test.my_hash # => {:a=>3, :b=>4}
答案 2 :(得分:2)
module HashizeModel
def [](key)
sym_key = to_sym_key(key)
self.instance_variable_get(sym_key)
end
def []=(key, value)
sym_key = to_sym_key(key)
self.instance_variable_set(sym_key, value)
end
private
def to_sym_key(key)
if key.is_a? Symbol
return ('@'+key.to_s).to_sym
else
return ('@'+key.to_s.delete('@')).to_sym
end
end
end