在
Ruby中,我想在Hash中存储一些东西,但是我不希望它是区分大小写的.所以例如:
- h = Hash.new
- h["HELLO"] = 7
- puts h["hello"]
这应该输出7,即使情况不同.我可以覆盖哈希的等号方法或类似的东西吗?
谢谢.
解决方法
为了防止这种改变完全破坏程序的独立部分(例如您使用的其他ruby gem),请为不敏感的哈希创建一个单独的类.
- class HashClod < Hash
- def [](key)
- super _insensitive(key)
- end
- def []=(key,value)
- super _insensitive(key),value
- end
- # Keeping it DRY.
- protected
- def _insensitive(key)
- key.respond_to?(:upcase) ? key.upcase : key
- end
- end
- you_insensitive = HashClod.new
- you_insensitive['clod'] = 1
- puts you_insensitive['cLoD'] # => 1
- you_insensitive['CLod'] = 5
- puts you_insensitive['clod'] # => 5
在覆盖作业和检索功能之后,它几乎是蛋糕.创建完整的哈希替代将需要更加细致地处理完整实现所需的别名和其他功能(例如#has_key?和#store).上述模式可以很容易地扩展到所有这些相关的方法.