4

range で次のステートメントを呼び出しましたtriples = "AAA".."ZZZ"

  1. triples.include? "ABC" # => true: slow in ruby 1.9 and fast in ruby 1.8

    出力が である理由は理解trueできましたが、Ruby 1.8 では速く、Ruby 1.9 では遅い理由がわかりませんでした。

  2. triples.include? "ABCD" # => false: ruby 1.9 and true: ruby 1.8

    両方のバージョンで出力が異なる理由がわかりませんでした。

  3. triples.cover? "ABCD" # => true and fast in ruby 1.9

    2番目のステートメントと同じ問題。

cover?ruby 1.9 でandinclude?ステートメントが異なるのはなぜですか?

4

2 に答える 2

4

Ruby >= 1.9 ではinclude?、範囲内のすべての要素を繰り返し処理し、指定された要素が存在するかどうかを確認します。

cover?要素が>=最初の要素範囲であり、<=範囲の最後の要素であるかどうかを確認するだけです。

Ruby が文字列を (レキシカルに) ソートする方法 "ABCD" > "AAA"と、"ABCD" < "ZZZ".

Ruby 1.8 では、include?Ruby 1.9 の のように扱われcover?ます。

なぜ違うのかという質問に答えるために、あなたの例は2つの異なる方法の必要性をよく示しています。

たとえば、数値が数値範囲内にあるかどうかを確認する場合は、10 億ではなく 2 つの要素を確認する(0..1_000_000_000).cover?(1_000_000_001)よりもはるかに高速です。include?

ただし、あなたの例は、include?が必要な理由を示しています。"ABCD"実際には range に含まれていませんが("AAA".."ZZZ")、それによってカバーされています。

于 2013-11-04T06:56:56.353 に答える