3

出于学术原因,我想让 Ruby 类的实例像哈希一样。

目标

  1. 用哈希初始化 MyClass 实例 # 成功
  2. 从 myClass 的实例请求值,如哈希 # 成功
  3. 然后将属性设置为哈希 #fail

尽管存在一些讨论,但我尝试了那里的内容(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}>
4

3 回答 3

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}
于 2013-09-21T23:48:52.380 回答
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
于 2014-08-28T06:05:19.963 回答
1

你应该把它写成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}
于 2013-09-21T23:46:03.783 回答