/ / Získanie hodnôt ruby ​​hash pomocou kľúčov - ruby-on-rails, rubín, polia, hash

Získanie rubínových hodnôt hašovania pomocou poľa kľúčov - rubínovo-na-koľajniciach, rubín, poliach, hash

Snažím sa vytvoriť objektktorý je inicializovaný pomocou hash a potom tento objekt zadá, aby získal hodnoty z tohto hash. Aby som to vyjasnil, je to hrubý príklad toho, čo mám na mysli:

class HashHolder
def initialize(hash)
@hash = hash
end

def get_value(*args)
# What are my possibilities here?
end
end

holder = HashHolder.new({:a => { :b => { :c => "value" } } } )
holder.get_value(:a, :b, :c) # should return "value"

Viem, že v zozname argumentov môžem vykonať iteráciu ako v:

def get_value(*args)
value = @hash
args.each do |k|
value = value[k]
end
return value
end

Ale ak mám v úmysle túto metódu veľa používať, dramaticky to zníži môj výkon, keď chcem len urobiť prístup k hodnote hash.

Máte k tomu nejaké návrhy?

odpovede:

7 pre odpoveď č. 1

Ak chcete aktualizovať odpoveď, pretože je to už dávno, čo bola požiadaná.

(testované v rubíne 2.3.1)

Máte hash takto:

my_hash = {:a => { :b => { :c => "value" } } }

Otázka:

my_hash.get_value(:a, :b, :c) # should return "value"

Odpoveď: Namiesto get_value použite „dig“, napríklad:

my_hash.dig(:a,:b,:c) # returns "value"

Pretože názov otázky je zavádzajúci (malo by to byť niečo ako: ako získať hodnotu vo vnútri vnoreného hashu pomocou radu kľúčov), je tu odpoveď na skutočne položenú otázku:

Získanie hodnôt ruby ​​hash pomocou kľúča

Príprava:

my_hash = {:a => 1, :b => 3, :d => 6}
my_array = [:a,:d]

odpoveď:

my_hash.values_at(*my_array) #returns [1,6]

4 pre odpoveď č. 2
def get_value(*args)
args.inject(@hash, &:fetch)
end


V prípade, že sa chcete vyhnúť vyhľadávaniu pri opakovanom vyhľadávaní (ktoré sa mi nezdá byť potrebné), musíte hash vyrovnať, aby ste ho mohli uložiť:

class HashHolder
def initialize(hash)
while hash.values.any?{|v| v.kind_of?(Hash)}
hash.to_a.each{|k, v| if v.kind_of?(Hash); hash.delete(k).each{|kk, vv| hash[[*k, kk]] = vv} end}
end
@hash = hash
end
def get_value(*args)
@hash[args]
end
end

-3 pre odpoveď č. 3

Ak viete, že štruktúra hashu je vždy v takom formáte, môžete jednoducho urobiť:

holder[:a][:b][:c]

... vracia „hodnotu“.