如何使Ruby类像Setter一样使用哈希

时间:2013-09-21 23:44:08

标签: ruby hash setter

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

目标

  1. 使用hash#success
  2. 初始化MyClass实例
  3. 从myClass实例请求值,就像哈希#success
  4. 一样
  5. 然后将属性设置为hash#fail
  6. 虽然存在一些讨论,但我尝试了那里的内容(12)但没有成功。让我知道我做错了什么。谢谢!

    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}>
    

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