gpt4 book ai didi

ruby - Ruby 中的基本数组迭代

转载 作者:数据小太阳 更新时间:2023-10-29 06:55:20 25 4
gpt4 key购买 nike

在遍历另一个数组的同时遍历一个数组的更好方法是什么?例如,如果我有如下两个数组:

names = [ "Rover", "Fido", "Lassie", "Calypso"]
breeds = [ "Terrier", "Lhasa Apso", "Collie", "Bulldog"]

假设数组彼此对应 - 也就是说,Rover 是一只梗犬,Fido 是一只拉萨阿普索犬,等等 - 我想创建一个狗类,并为每个项目创建一个新的狗对象:

class Dog
attr_reader :name, :breed

def initialize(name, breed)
@name = name
@breed = breed
end
end

我可以使用以下代码遍历名称和品种:

index = 0

names.each do |name|
Dog.new("#{name}", "#{breeds[index]}")
index = index.next
end

但是,我觉得使用索引变量是错误的做法。什么是更好的方法?

最佳答案

dogs = names.zip(breeds).map { |name, breed| Dog.new(name, breed) }

Array#zip 将目标数组与参数元素交织在一起,因此

irb> [1, 2, 3].zip(['a', 'b', 'c'])
#=> [ [1, 'a'], [2, 'b'], [3, 'c'] ]

您可以使用不同长度的数组(在这种情况下,目标数组决定结果数组的长度,额外的条目用nil 填充)。

irb> [1, 2, 3, 4, 5].zip(['a', 'b', 'c'])
#=> [ [1, 'a'], [2, 'b'], [3, 'c'], [4, nil], [5, nil] ]
irb> [1, 2, 3].zip(['a', 'b', 'c', 'd', 'e'])
#=> [ [1, 'a'], [2, 'b'], [3, 'c'] ]

您还可以将两个以上的数组压缩在一起:

irb> [1,2,3].zip(['a', 'b', 'c'], [:alpha, :beta, :gamma])
#=> [ [1, 'a', :alpha], [2, 'b', :beta], [3, 'c', :gamma] ]

Array#map 是转换数组的好方法,因为它返回一个数组,其中每个条目都是在目标数组中的相应条目上运行 block 的结果。

irb> [1,2,3].map { |n| 10 - n }
#=> [ 9, 8, 7 ]

在数组的数组上使用迭代器时,如果您提供多参数 block ,数组条目将自动分解为这些参数:

irb> [ [1, 'a'], [2, 'b'], [3, 'c'] ].each { |array| p array }
[ 1, 'a' ]
[ 2, 'b' ]
[ 3, 'c' ]
#=> nil
irb> [ [1, 'a'], [2, 'b'], [3, 'c'] ].each do |num, char|
...> puts "number: #{num}, character: #{char}"
...> end
number 1, character: a
number 2, character: b
number 3, character: c
#=> [ [1, 'a'], [2, 'b'], [3, 'c'] ]

Matt Briggs mentioned , #each_with_index 是另一个值得了解的好工具。它遍历数组的元素,依次传递一个 block 给每个元素。

irb> ['a', 'b', 'c'].each_with_index do |char, index| 
...> puts "character #{char} at index #{index}"
...> end
character a at index 0
character b at index 1
character c at index 2
#=> [ 'a', 'b', 'c' ]

当使用像 #each_with_index 这样的迭代器时,您可以使用括号将数组元素分解成它们的组成部分:

irb> [ [1, 'a'], [2, 'b'], [3, 'c'] ].each_with_index do |(num, char), index| 
...> puts "number: #{num}, character: #{char} at index #{index}"
...> end
number 1, character: a at index 0
number 2, character: b at index 1
number 3, character: c at index 2
#=> [ [1, 'a'], [2, 'b'], [3, 'c'] ]

关于ruby - Ruby 中的基本数组迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2648824/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com