Я хотел бы просмотреть массив объектов с помощью оператора 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
Не уверен, что это домашнее задание.
Дало ли домашнее задание массив хэшей в качестве отправной точки?
Да, я начал с массива хэшей Beatles.
Никто не использует цикл 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 Я вижу. Спасибо.
Вам действительно нужен массив, содержащий 4 отдельных хэша? Кажется довольно нелогичным начинать с
:nickname
, а затем сопоставлять его с:name
, тогда как большинство людей считают:name
общепринятым уникальным идентификатором битла. Почему бы не создать единый хэшbeatles
, используя:name
в качестве ключа и:nickname
в качестве значения, а не делать это поэтапно?