(你能告诉我今天正在学习 Ruby 吗?:))
我想确定我正在使用的多维数组是否是“矩形”——即,行的大小相同。这就是我正在做的,它有效,但感觉很笨重。
if @myArray[0].size != @myArray[0..@myArray.size].size
raise "This array is not a rectangle."
end
基本上,我正在检查第一个数组的大小是否等于所有其他数组的大小。不知何故,这似乎还不够“红宝石”,你知道吗?有人有更优雅的解决方案吗?
(你能告诉我今天正在学习 Ruby 吗?:))
我想确定我正在使用的多维数组是否是“矩形”——即,行的大小相同。这就是我正在做的,它有效,但感觉很笨重。
if @myArray[0].size != @myArray[0..@myArray.size].size
raise "This array is not a rectangle."
end
基本上,我正在检查第一个数组的大小是否等于所有其他数组的大小。不知何故,这似乎还不够“红宝石”,你知道吗?有人有更优雅的解决方案吗?
尝试:
raise 'This array is not a rectangle' \
if myArray[1..-1].any? { |row| row.size != myArray[0].size }
请参阅http://www.ruby-doc.org/core/classes/Array.html([] 运算符)和http://www.ruby-doc.org/core/classes/Enumerable.html(any ?方法)
这不会引发错误:
@my_array = [[1,2,3,4],[1,2,3,4]]
for row in @my_array
if row.size != @my_array.first.size
raise "This array is not a rectangle"
end
end
这将引发错误:
@my_array = [[1,2,3,4],[1,2,3]]
for row in @my_array
if row.size != @my_array.first.size
raise "This array is not a rectangle"
end
end
此代码遍历数组内的所有子数组,并检查它们的行大小是否与第一个的大小不同,如果是这种情况,则会引发错误。
我可能会做其他人发布的事情,或者
if 1 == @myArray.map { |row| row.size }.uniq.size
# ...
end
您应该注意,您的示例代码并没有按照您的想法执行
# this creates an array that holds a slice
# of elements from @myArray ( a to b inclusive )
@myArray[ a .. b ]
# this just gets the size of the slice
# (equal to b-a+1)
@myArray[a .. b].size
因此,您的 if 语句实际上将行大小与列大小进行了比较(加 1,因为它是 0 到 @myArray.size 包括在内)。它没有将每一行的大小与第一行进行比较。为此,您需要使用 each、map 或其他方法显式迭代。