Как использовать оператор case для перебора массива объектов и добавления значения к ключу внутри массива?

Я хотел бы просмотреть массив объектов с помощью оператора case и добавить новое значение к имени ключа. Я новичок в программировании, пожалуйста, используйте самые простые примеры и пояснения.

Я попытался написать оператор case, используя оператор равенства, чтобы добавить новое значение к имени ключа.

beatles = [
    {
      name: nil,
      nickname: "The Smart One"
    },
    {
      name: nil,
      nickname: "The Funny One"
    },
    {
      name: nil,
      nickname: "The Cute One"
      },
    {
      name: nil,
      nickname: "The Quiet One"
    }
  ]

  i = 0
  while i < beatles.length
    case beatles
    when nickname == "The Smart One"
        name = "John"
    when nickname == "The Funny One"
        name = "Ringo"
    when nickname == "The Cute One"
        name = "Paul"
    when nickname == "The Quiet One"
        name = "George"
    end
    i += 1
  end

  i = 0
  while i < beatles.length
    puts "Hi, I'm #{beatles[i][:name]}.  I'm #{beatles[i][:nickname]}!"
    i += 1
  end

Вам действительно нужен массив, содержащий 4 отдельных хэша? Кажется довольно нелогичным начинать с :nickname, а затем сопоставлять его с :name, тогда как большинство людей считают :name общепринятым уникальным идентификатором битла. Почему бы не создать единый хэш beatles, используя :name в качестве ключа и :nickname в качестве значения, а не делать это поэтапно?

pjs 28.05.2019 16:05

Не уверен, что это домашнее задание.

Calvin Mitchell 29.05.2019 17:45

Дало ли домашнее задание массив хэшей в качестве отправной точки?

pjs 29.05.2019 20:16

Да, я начал с массива хэшей Beatles.

Calvin Mitchell 30.05.2019 07:51
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
0
4
110
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Никто не использует цикл while в Ruby (вместо этого мы используем Enumerable#each, Enumerable#map и Enumerable#reduce), но ради ответа на поставленный здесь вопрос является запрошенной версией.

while i < beatles.length
  beatles[i][:name] =
    case beatles[i][:nickname]
    when "The Smart One" then "John"
    when "The Funny One" then "Ringo"
    when "The Cute One" then "Paul"
    when "The Quiet One" then "George"
    end
  i += 1
end

case сравнивает свой аргумент с вариантами (используя метод Object#===). Кроме того, вы не хотите присваивать nameвнутриcase, вместо этого лучше присвоить его результату case.


Идиоматическая версия Руби:

beatles.each do |beatle|
  beatle[:name] =
    case beatle[:nickname]
    when "The Smart One" then "John"
    when "The Funny One" then "Ringo"
    when "The Cute One" then "Paul"
    when "The Quiet One" then "George"
    end
end

Точно так же вывод является однострочным: beatles.each { |beatle| puts "Hi, I'm #{beatle[:name]}. I'm #{beatle[:nickname]}!" }

pjs 28.05.2019 16:00

@pjs Я вижу. Спасибо.

Calvin Mitchell 30.05.2019 07:50

Другие вопросы по теме