【问题标题】:How to loop nested arrays in Ruby如何在 Ruby 中循环嵌套数组
【发布时间】:2018-05-31 14:06:40
【问题描述】:

对 Ruby 和一般编码来说非常陌生。我正在尝试遍历二维数组,但无法弄清楚。这是我所拥有的:

--使用循环在不同的行上打印出每个人的不同自我。

--布鲁斯·韦恩,又名蝙蝠侠

people = [
  ["Bruce", "Wayne", "Batman"],
  ["Selina", "Kyle", "Catwoman"],
  ["Barbara", "Gordon", "Oracle"],
  ["Terry", "McGinnis", "Batman Beyond"]
]

index = people[0][0]

first_name = people[0][0]
last_name = people[0][1]
hero_name = people[0][2]

4.times do
  puts first_name + " " + last_name + "," " " + "a.k.a" " " + hero_name
  index = index + 1
end

它确实打印了第一行,但随后引发了错误:

Bruce Wayne, a.k.a Batman
# `+': no implicit conversion of Integer into String (TypeError)

【问题讨论】:

  • "," " " - 我认为高级 Ruby ;-)

标签: ruby


【解决方案1】:

在 ruby​​ 中,我们不使用索引循环,例如 for 和 family;相反,我们迭代集合:

people =
  [["Bruce", "Wayne", "Batman"],
   ["Selina", "Kyle", "Catwoman"],
   ["Barbara", "Gordon", "Oracle"],
   ["Terry", "McGinnis", "Batman Beyond"]]

people.each do |first, last, nick|
  puts "#{first} #{last}, a.k.a #{nick}"
end

people.each do |first_last_nick|
  *first_last, nick = first_last_nick
  puts [first_last.join(' '), nick].join(', a.k.a ')
end

【讨论】:

  • 我们在 Ruby 中是否通过 + concatenate strings? ;-)
  • @Stefan 复制粘贴是一个纯粹的邪恶 :) 我 总是 像第二个示例一样执行 join,用 compact 处理 nils 而不是傻ifs。顺便说一句。
【解决方案2】:

您的代码会产生错误,因为您将字符串分配给索引

index = people[0][0]

然后你用它来计数

index = index + 1

你可以使用

index = 0 

index += 1 

一种更 Rubyesque 的方式是枚举数组并像这样打印它

people.each do |person|
  puts "#{person.first} #{person[1]}, a.k.a #{person.last}"
end

这给了

Bruce Wayne, a.k.a Batman
Selina Kyle, a.k.a Catwoman
Barbara Gordon, a.k.a Oracle
Terry McGinnis, a.k.a Batman Beyond

将部分存储在变量中可以提高可读性,但会延长代码的长度,这反过来会降低可读性,选择权在您手中..

作为替代方案,您可以命名索引或像 mudasobwa 建议的那样分解。

Firstname, Lastname, Nickname = 0, 1, 2
people.each do |person|
  puts "#{person[Firstname]} #{person[Lastname]}, a.k.a #{person[Nickname]}"
end

【讨论】:

  • 更多 Rubyesque 将分解 person 而不是使用索引 :)
  • @mudasobwa 建议使用people.each do |fn, ln, hn| 而不是索引。
  • @mudasobwa 是的,更好,我更喜欢你的,顺便说一句,我使用了索引或分解,所以我还在“更多”中更改了“最多”:)
  • 很好的解释。另一个问题是index 从未在 OP 的代码中用于访问数组,因此它会产生 4 次相同的输出。
  • @mudasobwa 更多 Rubyesque 将是构建一个知道如何呈现自己的 Person 对象和一个包含它们的 People 类:)(以及一个 Soylent Green 工厂分解它们)
【解决方案3】:

让您的代码正常工作:

4.times do |character|
  puts people[character][0] + " " + people[character][1] + "," " " + "a.k.a" " " + people[character][2]
end 

但是在 ruby​​ 中进行迭代是按照其他人的回答完成的。 这是一个使用块 {} 代替的版本:

people = [["Bruce", "Wayne", "Batman"], ["Selina", "Kyle", "Catwoman"], ["Barbara", "Gordon", "Oracle"], ["Terry", "McGinnis", "Batman Beyond"]]

people.each { |character| puts "#{character [0]}, a.k.a   #{character [1]} #{character [2]}" }

#=> Bruce, a.k.a   Wayne Batman
#=> Selina, a.k.a   Kyle Catwoman
#=> Barbara, a.k.a   Gordon Oracle
#=> Terry, a.k.a   McGinnis Batman Beyond

一般循环嵌套数组:

people.each do |character|
  character.each do |name|
    puts name
  end
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-24
    • 2013-06-10
    • 1970-01-01
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    • 2015-11-22
    • 1970-01-01
    相关资源
    最近更新 更多