我在理解Ruby中某些代码的行为时遇到了一些麻烦。我想将我的2d数组的内容与特定的1d数组匹配。
s = [1,2,3].repeated_permutation(2).to_a
solution = [3,1]
s.each do |x|
if x != solution
puts s.length
print "#{x}\n"
s.delete(x)
end
end
我不明白的是,此代码将返回此内容:
s = [[1, 2], [2, 1], [2, 3], [3, 1], [3, 3]]
我是初学者,我必须忽略一些基本的东西。 我通过以一种肯定不理想的方式绕过它来克服这个问题:
s = [1,2,3].repeated_permutation(2).to_a
solution = [3,1]
s.each_with_index do |x,idx|
if x != solution
s[idx] = nil
end
end
=> [nil,nil,nil,nil,nil,nil,nil,[3,1],nil]
s.flatten!.compact!
=> [3,1]
有谁能告诉我执行此检查的Ruby方法是什么? 提前致谢
答案 0 :(得分:2)
查看.select方法,该方法可用于根据块的评估从数组中选择值。例如:
s.select { |arry| arry == solution }
这将返回一个数组,其中包含s
中与solution
数组匹配的元素,例如[[3,1]]
答案 1 :(得分:2)
您所寻找的实际上是Enumerable#detect
:
[[1, 2], [2, 1], [2, 3], [3, 1], [3, 3]].detect { |e| e == [3, 1] }
#⇒ [3, 1]
您的代码返回整个数组的原因是Enumerable#each
迭代器返回接收器本身。不建议在枚举过程中改变可枚举,这可能会导致不可预测/意外的结果。当基础数组发生变化时,each
会变得疯狂。