Я получаю (TypeError) при попытке получить доступ к вложенному массиву хэшей - PullRequest
0 голосов
/ 24 февраля 2019

Допустим, я работаю в тренажерном зале для скалолазания и пытаюсь облегчить процесс посещения.Здесь я пытаюсь получить доступ к age значениям внутри хешей, которые находятся в массиве, вложенном в хеш.Хотя я получаю правильное количество выводимых «belayers», я также получаю TypeError для строки parties[:attendance].each do |kid|.Я понимаю, что это неправильно, но я не уверен, как это исправить.Любой совет будет полезен.

def kids_hash
  kids_hash = {
    :party_one =>{
      :facilitator => 'Erica',
      :attendance => [
      {name: 'Harry', age: 6, wavers: 'yes', harness: "red", shoe_size: 3},
      {name: 'Frankie', age: 9, wavers: 'yes', harness: "blue", shoe_size: 7},
      {name: 'Gale', age: 4, wavers: 'yes', harness: "red", shoe_size: 3},
      {name: 'Rony', age: 4, wavers: 'no', harness: "red", shoe_size: 2},
      {name: 'Julia', age: 10, wavers: 'yes', harness: "blue", shoe_size: 9},
      {name: 'Sarah', age: 3, wavers: 'no', harness: "red", shoe_size: 13},
      {name: 'James', age: 3, wavers: 'yes', harness: "red", shoe_size: 2},
      {name: 'Kevin', age: 5, wavers: 'yes', harness: "red", shoe_size: 3},
      {name: 'Jessie', age: 11, wavers: 'yes', harness: "blue", shoe_size: 10}
      ]
    },
    :party_two => "not booked yet"
  }
end

def num_belayers
  kid_count = 0
  baby_count= 0
  kids_hash.values.each do |parties|
    parties[:attendance].each do |kid|
      if kid[:age] >= 5 
          kid_count += 1
        else
          baby_count +=1
        end
      end

    #if the kids are 5 y/o, we put 5 to a group
    belays_kids = kid_count / 5.00

    #if they are younger, there are 3 to a group
    belays_babies = baby_count / 3.00
    belays = belays_kids.ceil + belays_babies.ceil

    puts "You will need #{belays} belayers."
  end
end

Ответы [ 2 ]

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

Этот код выдает ошибку, когда "party" не является хешем.Вы предполагаете, что это хеш, и написали код для того же самого.Таким образом, он заканчивает тем, что выдает исключение, когда что-то, что не исключено, приходит точно так же, как в ваших тестовых входных данных party_one - это хеш, а party_two - строка.Я предлагаю проверить, является ли «party» хеш-кодом, и продолжить, иначе пропустите код для этой стороны.

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

party_two ключ не относится к Hash, поэтому вы получаете исключение.Попробуйте следующий код.

def num_belayers
  kid_count = 0
  baby_count= 0
  kids_hash.each_value do |parties|
    next unless parties.is_a?(Hash)
    parties[:attendance].each do |kid|
      if kid[:age] >= 5 
          kid_count += 1
        else
          baby_count +=1
        end
      end

    #if the kids are 5 y/o, we put 5 to a group
    belays_kids = kid_count / 5.00

    #if they are younger, there are 3 to a group
    belays_babies = baby_count / 3.00
    belays = belays_kids.ceil + belays_babies.ceil

    puts "You will need #{belays} belayers."
  end
  nil 
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...