Проверьте хеш, если ключ существует;если нет, создайте массив и добавьте значение - PullRequest
0 голосов
/ 16 февраля 2019

Пример выглядит следующим образом:

if house['windows'][floor_1]
  house['windows'][floor_1] << north_side
else
  house['windows'][floor_1] = [north_side]
end

Лучший способ проверить существующий ключ?

Ответы [ 3 ]

0 голосов
/ 16 февраля 2019

Учитывая ваш хэш, я представляю:

house = { windows: { floor_0: ['f0'] } }

Вы можете проверить наличие ключа, используя Hash#has_key?

house[:windows].has_key? :floor_1 #=> false

Таким образом, вы можете создатьit:

house[:windows].merge!({floor_1: []}) unless house[:windows].has_key? :floor_1


Лучше, если вы определите значение дефолта, используя, например, Hash#default_proc=:
house[:windows].default_proc = proc { |h, k| h[k] = [] } 

Так что вы можете

house[:windows][:floor_3] << 'f3'

house #=> {:windows=>{:floor_0=>["f0"], :floor_1=>[], :floor_3=>["f3"]}}
0 голосов
/ 17 февраля 2019

Я бы что-то вроде:

house['windows'][floor_1] ||= []
house['windows'][floor_1] << north_side
0 голосов
/ 16 февраля 2019

Тот факт, что house['windows'] является элементом в хэше, уже является чем-то вроде красной сельди, поэтому я буду использовать windows в качестве переменной, ссылающейся на хеш.

Установите значение по умолчанию дляхеш windows, так что любому несуществующему ключу присваивается значение массива:

windows = Hash.new {|hash, key| hash[key] = [] }

Теперь вы можете автоматически добавлять (<<) к новым хеш-элементам.

windows['floor_1'] << 'north_side'

windows # => {"floor_1"=>["north_side"]}

В вашем конкретном случае замените windows на house['windows'].


РЕДАКТИРОВАТЬ

Как указано в комментариях, это поведение можно добавитьк уже созданному хешу:

windows.default_proc = proc {|hash, key| hash[key] = [] }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...