0

次のコードを理解できません。

vowels_arr = ["a","e","i","o","u"]
(0...(vowels_arr.length - 1)).all? {|i| vowels_arr[i] <= vowels_arr[i + 1]}

-1 なしで実行しようとすると、文字列を nil と比較できないというエラーが表示されます。しかし、私が理解できないのは、なぜ-1が必要なのですか?? "..." レンジャーは、"a"、"e"、"i"、"o" (5 つのうち 4 つ) のみを評価するようにします。全体の長さは 5 で、比較対象はすでに 4 であるため、比較 (vowels_arr[i] <= vowels_arr [i+1]) は -1 なしで機能するはずです。

配列の長さの後に -1 が必要な理由を誰かに説明してもらえますか?

また、nilエラーと比較してこれを乗り越えるためのRubyの他の方法はありますか?

4

3 に答える 3

2

これは次の理由によるものです。

vowels_arr[i + 1]

(0...(vowels_arr.length))配列のすべてのインデックスを返します。

(0...(vowels_arr.length)).to_a # => [0, 1, 2, 3, 4]

しかし、現在から次のインデックスを取得しようとしています。nil現在のインデックスが最後のインデックス (4) である場合、文字列が期待される場所に到達するため (存在しないインデックスに要素が存在しないため)、エラーが発生します。length - 1そのため、ロジックが配列の境界を超えないようにする必要があります。

ところで、配列がソートされているかどうかを確認しようとしている場合は、もっと直接的に調べてみませんか?

vowels_arr = ["a","e","i","o","u"]
puts vowels_arr.sort == vowels_arr 
# >> true
于 2013-05-26T10:57:12.787 に答える
1

セルジオが答えるように、問題はvowels_arr[i + 1]. 変数のi範囲は のインデックスにまたがるため、vowels_arr必ずしもi + 1の既存のインデックスを指すとは限りませんvowels_arr。特に、i最後のインデックスに到達するi + 1と、既存のインデックスよりも大きくなり、 にvowels_arr[i + 1]なりますnil

また、Sergioが答えたように、目的がソートされているかどうかを確認することである場合、Sergioの答えを実行するのは簡単ですが、一般的な場合、次のようにすることができます:

vowels_arr.each_cons(2).all?{|e1, e2| e1 <= e2}
于 2013-05-26T11:52:58.267 に答える