2

(你能告诉我今天正在学习 Ruby 吗?:))

我想确定我正在使用的多维数组是否是“矩形”——即,行的大小相同。这就是我正在做的,它有效,但感觉很笨重。

if @myArray[0].size != @myArray[0..@myArray.size].size
  raise "This array is not a rectangle."
end

基本上,我正在检查第一个数组的大小是否等于所有其他数组的大小。不知何故,这似乎还不够“红宝石”,你知道吗?有人有更优雅的解决方案吗?

4

3 回答 3

3

尝试:

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 ?方法)

于 2009-02-14T22:56:14.537 回答
1

这不会引发错误:

@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

此代码遍历数组内的所有子数组,并检查它们的行大小是否与第一个的大小不同,如果是这种情况,则会引发错误。

于 2009-02-14T22:58:19.773 回答
1

我可能会做其他人发布的事情,或者

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 或其他方法显式迭代。

于 2009-02-14T23:33:28.800 回答