Что вы называете своим первым хэшем, это не хэш. Фактически, это не объект Ruby. Если это должно быть хэш, вы должны написать это:
g = { :Grp1 => { key1: value1, key2: value2, key3: value3 },
:Grp2 => { key1: value4, key2: value2, key3: value5 } }
Поскольку ключи все символы, вы можете вместо этого использовать синтаксис:
g = { Grp1: { key1: value1, key2: value2, key3: value3 },
Grp2: { key1: value4, key2: value2, key3: value5 } }
value1
(и value2
и так on) должен быть либо переменной, либо методом, но вы не дали нам его значение (если это переменная) или его возвращаемое значение (если это метод), поэтому я заменю эти переменные или методы литералами:
g = { Grp1: { key1: 7, key2: 4, key3: 'cat' },
Grp2: { key1: 1, key2: 3, key3: 'dog' } }
Ваш второй хэш:
h = { :key1 => value4, :key2 => value2 }
имеет те же проблемы, поэтому я заменить его:
h = { :key1 => 1, :key2 => 3 }
, которые альтернативно могут быть выражены:
h = { key1: 1, key2: 3 }
Предполагая, что у меня есть правильно написано, мы можем написать метод следующим образом, используя методы Hash#keys, Hash#key?, Enumerable#find и Enumerable#all?:
def doit(g, h)
hkeys = h.keys
puts "hkeys=#{hkeys}"
g.find do |k,v|
puts "k=#{k}"
puts "v=#{v}"
hkeys.all? do |j|
puts " v.key?(#{j})=#{v.key?(j)}"
puts " v[#{j}]==#{h[j]}: #{v[j]==h[j]}"
v.key?(j) && v[j] == h[j]
end
end
end
Я добавил некоторые puts
заявления, так что вы можете увидеть результаты расчетов. Для g
и h
определенно выше (с буквенными значениями):
doit(g,h)
hkeys=[:key1, :key2]
k=Grp1
v={:key1=>7, :key2=>4, :key3=>"cat"}
v.key?(key1)=true
v[key1]==1: false
k=Grp2
v={:key1=>1, :key2=>3, :key3=>"dog"}
v.key?(key1)=true
v[key1]==1: true
v.key?(key2)=true
v[key2]==3: true
#=> [:Grp2, {:key1=>1, :key2=>3, :key3=>"dog"}]
После зачистки из puts
заявления и сделать одно небольшое изменение, я бы написать метод так:
def doit(g, h)
hkeys = h.keys
g.find { |_,v| hkeys.all? { |j| v.key?(j) && v[j] == h[j] } }
end
Небольшое изменение что я заменил блочную переменную k
на переменную _
, чтобы обратить внимание на то, что я не использую ее в блоке.
Существует много способов написать этот метод.Вот другой, используя метод Hash#values_at:
def doit(g, h)
hkeys = h.keys
hvalues = h.values
g.find { |_,v| v.values_at(*hkeys) == hvalues }
end
Я голосую, чтобы закрыть этот вопрос не по теме, потому что она просит нас, чтобы написать свободный код. –
Бесплатный код - это единственный код, который я пишу, поэтому у меня нет возражений против предложения некоторых. Более того, я знаю, что новички Ruby иногда не знают, с чего начать решать проблему, поэтому я не настаиваю на том, чтобы код отображался как доказательство того, что искатель попытался решить проблему. (Я также помню, что высокопоставленные искатели * никогда не просили показать свой код.) –
Предлагаю вам отредактировать свой вопрос, чтобы правильно выразить две хэши, как я сделал в своем ответе, или, если я ошибаюсь, как они должны появляться. Также полезно назначить каждую переменную так, чтобы те, кто давал ответы или столбцы публикации, могли просто ссылаться на переменные без необходимости их определения. –