Как я могу присвоить несколько значений ключу хеша?

Разрешение методов и конструкторов в перечислениях удивило меня. Например:

enum Cats {
  FELIX(2), SHEEBA(3), RUFUS(7);

  private int mAge;
  Cats(int age) {
    mAge = age;
  }
  public int getAge() {
    return mAge;
   }
}

у Вас может даже быть "постоянное определенное тело класса", которое позволяет определенное перечисление значений переопределенным методам.

[еще 114] документация здесь .

6
задан the Tin Man 3 April 2013 в 20:37
поделиться

4 ответа

Вы создали хэш с именем символа в качестве ключа и массивом с тремя элементами в качестве значения, поэтому вам нужно выполнить итерацию через myhash [: name] , чтобы получить отдельные элементы массива.

4
ответ дан 8 December 2019 в 13:00
поделиться
myhash.each_pair {|k,v| v.each {|n| puts "#{k} => #{n}"}}
#name => Tom
#name => Dick
#name => Harry

Формат вывода не совсем то, что вам нужно, но я думаю, вы уловили идею.

6
ответ дан 8 December 2019 в 13:00
поделиться

Ответы Рохита и Пирра в этом случае подходят. Однако, если это то, что вы собираетесь широко использовать, стоит знать, что структура данных, которая ведет себя как хэш, но допускает несколько значений для ключа, обычно называется мульти-картой. Есть несколько реализаций этого для Ruby, включая эту .

5
ответ дан 8 December 2019 в 13:00
поделиться

re: проблема перебора выборочных ключей. Попробуйте использовать reject с инвертированным условием вместо использования select .

например, указано:

{:name=>["Tom", "Dick", "Harry"], :keep=>[4, 5, 6], :discard=>[1, 2, 3]}

где мы хотим : name и : keep , но не : сбросить

с помощью select :

myhash.select { |k, v| [:name, :keep].include?(k) }
=> [[:name, ["Tom", "Dick", "Harry"]], [:keep, [4, 5, 6]]]

Результатом является список пар.

но с отклонить :

myhash.reject { |k, v| ![:name, :keep].include?(k) }
=> {:name=>["Tom", "Dick", "Harry"], :keep=>[4, 5, 6]}

в результате получается хеш, содержащий только нужные вам записи.

Затем это можно объединить с ответом Pierr:

hash_to_use = myhash.reject { |k, v| ![:name, :keep].include?(k) }
hash_to_use.each_pair {|k,v| v.each {|n| puts "#{k} => #{n}"}}
3
ответ дан 8 December 2019 в 13:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: