How do I convert hash keys to method names?

前端 未结 5 584
暖寄归人
暖寄归人 2020-12-02 14:37

This is my hash:

tempData = {\"a\" => 100, \"here\" => 200, \"c\" => \"hello\"}

I need to access the hash keys as a method like:

5条回答
  •  离开以前
    2020-12-02 14:52

    Alternatively, if it’s just a small script it might be more convenient to just extend Hash itself

    class Hash
      def method_missing sym,*
        fetch(sym){fetch(sym.to_s){super}}
      end
    end
    

    method_missing is a magic method that is called whenever your code tries to call a method that does not exist. Ruby will intercept the failing call at run time and let you handle it so your program can recover gracefully. The implementation above tries to access the hash using the method name as a symbol, the using the method name as a string, and eventually fails with Ruby's built-in method missing error.

    NB for a more complex script, where adding this behavior might break other third-party gems, you might alternatively use a module and extend each instance

    module H
      def method_missing sym,*
        fetch(sym){fetch(sym.to_s){super}}
      end
    end
    
    the = { answer: 42 }
    the.extend(H)
    the.answer # => 42
    

    and for greater convenience you can even propagate the module down to nested hashes

    module H
      def method_missing sym,*
        r = fetch(sym){fetch(sym.to_s){super}}
        Hash === r ? r.extend(H) : r
      end
    end 
    
    the = { answer: { is: 42 } }
    the.extend(H)
    the.answer.is # => 42
    

提交回复
热议问题