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

他の人が投稿したようなことをするかもしれません、または

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ステートメントは実際にrowsizeをcolumnsizeと比較しました(0から@ myArray.sizeまでだったのでプラス1)。各行のサイズを最初の行と比較しませんでした。これを行うには、each、map、またはその他の方法を使用して、明示的に反復する必要があります。

于 2009-02-14T23:33:28.800 に答える
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 に答える