ruby-reference-manual:1715
From: 5 5 <redmine@r...>
Date: Fri, 18 Sep 2009 14:20:59 +0900
Subject: [ruby-reference-manual:1715] [Bug #2112] Range#=== の実行例ほか
Bug #2112: Range#=== の実行例ほか http://redmine.ruby-lang.org/issues/show/2112 起票者: 5 5 ステータス: Open, 優先度: Normal カテゴリ: doc reporter: 5.5, ruby_version: 1.8, 1.9 まず,Range#=== の実行例で, 文字列の場合、include? は辞書p (0.1 .. 0.2).member?(0.15) # => cannot iterate from Float (TypeError)順の比較になる という行があるのですが,「辞書」と「順」の間に,余計なものが入り込んでいるようです。 また,これを取り去ると, 文字列の場合、include? は辞書順の比較になる という文になりますが,Ruby 1.9 の動作は辞書式配列での比較ではないので,Ruby 1.9.1 版,1.9.2 版については間違いですね。 この実行例で,include? と member? の二種類が出てくるのは,Ruby 1.8.1 まではこれらが別メソッドで,member? の動作が違っていたからだと思いますが,この実行例だけからそれを読み取るのは困難です。 推測するに, ◇Range#include? ・1.8.x では最初の要素および終端と <=> で比較することにより判定 ・1.9.x では他の方法で判定 ◇Range#member? ・1.8.2 以降と 1.9.x では Range#include? と同じメソッド ・1.8.1 までは Range#include? と別メソッド でしょうか? バージョン間の差異を書くなら,こんなふうにまとめていただけるとありがたいです。 (本当なら 1.8.0 版,1.8.1 版では member? を別ページにすべきなのでしょうけど) ところで,1.8.1 までで,Range#=== が include? だったのか member? だったのかも書く必要があると思います。 Ruby 1.9.1 版で, <=> メソッドによる演算により範囲内かどうかを判定するには Range#cover? を使用してください。 という記述があるので,Ruby 1.9.1 では判定に <=> を使わない,ということは分かりますが,ではどうやって判定しているのか書かれていません。 self.any?{|x| x==obj} 的な実装なのかどうか知りませんが,Range#cover? に比べて極端に計算コストが大きいようなので,そのことも書いてほしいです。(1.8 用のライブラリを移植する人には重要な情報) なお,「範囲に含まれる」の意味をより明瞭にするため, (0...5).include?(5) # => false のような例を入れては如何でしょうか。 細かいことですいません。引数 obj の説明が 比較対象のオブジェクト となっていますが,Ruby 1.9 ではおそらく比較を使わずに判定しているので,「比較対象」という表現は適当でないと思います。 ---------------------------------------- http://redmine.ruby-lang.org -- ML: ruby-reference-manual@m... 使い方: http://QuickML.com/