62.1. Slovník necitlivý na velikost písmen Case Insensitive Hash

V mailing listu se objevil dotaz jak implementovat slovník který není citlivý na velikost písmen. T.j kde h['a'] je stejný prvek jako h['A'].

Nejjednodušší navržený způsob je předefinovat metodu has_ikey? takto

class Hash
    def has_ikey?(key)
        self.keys.map {|key| key.upcase }.member? key.upcase
    end
end

Velikou nevýhodou tohoto řešení je pomalost, tedy výpočetní naročnost degraduje použití slovníku.

Jiným řešením je změnit chování Ruby nastavením proměnné $=

$= = true    # case insensitive

tento způsob však ovlivní všechny části Ruby.

Asi nejlepším řešením je definovat si vlastní třídu objektů s požadovanou vlastností

class CIHash < Hash
    alias get_old []
    alias set_old []
    def [](key)
        return get_old(key.to_s.upcase)
    end
    def []=(key, value)
        return set_old(key.to_s.upcase, value)
    end
end

Licence Creative Commons
Tento dokument Ruby, jehož autorem je Radek Hnilica, podléhá licenci Creative Commons Uveďte autora-Nevyužívejte dílo komerčně-Zachovejte licenci 3.0 Česká republika .