Siena. です。 ▼ [ruby-list:35279] < Yukihiro Matsumoto さん 》|おまけに Time の場合には、差分が 0.01 秒か、1 日か、はたまた 》|1 世紀なのか、まるで見当が付かないという問題もありますね。 》 》Timeは「秒が単位(マイクロ秒は補助的)」という定義がありますか 》ら、それほど問題ではないと思います。 はい、内部表現を根拠に Time#succ は 1 秒刻みとする というのが体系的に妥当である、という点は異議ありません。 ただ、あたしとしては、あまり使い道を思い浮かばないです。 1 時間とか 1 日といった、もっと大きな刻み幅を単位に進む 時刻表現系が欲しいなど、場面によって様々だと思います。 それは、Time ではなく Date であるという事でしょうか。 Time#succ では、「刻み幅は 1 秒に固定」というあまり 使われなそうな定義を与えておくか、使う側に歩み寄って 生成時引数やメソッドで刻み幅を変えられるようにしておくのか、 その場合はデフォルトは 1 秒で良いのか、というところで、 どれが適切なのかはあたしには難しいです。 # 悩んだ挙句、後者でデフォルトを 1 秒としたいかな... では、Date#succ を定義するとしたらどうすべきでしょうか。 "Date" だから刻み幅は 1 日でもいいように思えますが、やはり 変えられるようになっていて欲しいという欲求もふつふつと ^^; 》Rangeは「数え上げられる範囲」が主ですが、「ここからここまで」 》という範囲を表現する場合もありえるからです。Rubyでは目的によっ これは、中途半端にそうなっているように感じます。 Range#=== で ( 1..3 ) === 1.5 が true となる事を 指していると思うのですが、これしか思い当たりません。 他に「連続区間」としての挙動はあるでしょうか。 確認しておきたいのですが、Range は、「数え上げられる範囲」と 「連続区間」の両方を表現すべく導入されたものでしょうか。 それとも、基本的に「数え上げられる範囲」であって、便宜的に 「連続区間」としても機能する場合があるというものでしょうか。 あたしは、後者の立場で捉えていまして、「連続区間」 としての側面を強く支持するのには少々抵抗を感じます。 # どうも、Ruby いじりはじめの頃に、これに関係する何かで # はまったか悩んだかしたらしく、そもそも「連続区間」 # とは見做さないようにしている節すらあるようです ^^; Range のあるべき姿が前者だとしますと、「連続区間」らしく挙動を 拡充する予定がある、もしくは拡充する事に問題はないでしょうか。 以前から区間演算ができると便利だと思っていましたが、 例えば区間の分割を考えると、(1..3).split( 1.5 ) の結果が [ 1..1, 2..3 ] と [ 1..(1.5), (1.5)..3 ] のどちらになるのか、 悩ましいです。前者が Range 的で、後者が Interval(仮) 的かと。 first と last の属する集合に依存するのもややこしいように思います。 》て細かくクラスを分けるよりひとつのクラスにいろいろ詰め込む傾 》向があります(大クラス主義)。 はい。共存できるなら詰め込む事に異議はありません。 》|Interval(仮) のように連続な区間も表せるように Range を 》|拡張するというのもありえるとは思いますが、そうすると 》|少なくとも #to_a は妥当な定義が与えられないような気がします。 》 》「連続な区間を表現する場合には有意義な結果は与えられない」と 》いうのは妥当な定義だと思います。 それって、妥当なのでしょうか。 連続区間から 0.5 刻みで値を列挙したいとか、極端な話、ブロックで 与えられるある条件を満たす値を列挙したいとかいう要求がありそうです。 これは十分に妥当な要求で、これにそった定義も適切に思えます。 かといって、Range を「数え上げられる範囲」と (例えば、1..4 を集合 { 1, 2, 3, 4 } のように) 見做すなら、それは適切ではないかもしれません。 ▼ [ruby-list:35272] < Siena. 》あと、(1..2) === 1.5 は ArgumentError となります (ruby 1.6.4) が、 は、true になりますね。何を間違えていたのかしら --;?? 動かしてエラーになったのを確認したつもりでしたのに... --- Siena. <mailto:siena / cr.chiba-u.ac.jp>