[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]