先日来、ruby-talkでRangeについていろいろと議論されていたことを解消できるめどが立った。
しかし、その完全解決にはひとつ、もしくはふたつメソッドを追加する必要があるのだが、 良い名前が思いつかないのだ。困った。
ひとつめは大小比較で包含関係を判定するRangeクラスのメソッド。 1.8でいうとinclude?に相当するのだが、1.9ではこれは基本的に、 要素として含むかどうかという離散的な包含関係を意味することにした。 ただし、include?とmember?は数だけは例外として大小関係で判定する。
名前の候補としては「encompass?」と「span?」があがっているが、 いまいちピンとこない。便利なメソッドなのでできるだけ短い名前にしたいのだが、
beg <= x <= end
という関係が明確に分かるとありがたい。
もうひとつは、succで作られる列に含まれるかどうかを判定するメソッド。 つまり、このメソッドの名前を仮にfooとしたとすると、
x.foo(beg,end)
は begからendまでsuccを使って順に値を生成した場合、その列にxを含むとき、真を返すというもの。 xを含まない、あるいはsuccを使ってbegからendにたどりつけない場合には偽を返す。
これがあるとinclude?などの包含関係の判定でループを回さなくてもすむので効率が向上する。 効率だけの問題なので、なくてもいいし、直接呼ばれることもないので短い名前である必要もない。 「between?」に近いのだがComparable#between?が大小関係で比較すると決まっているので、 離散的なこちらには別の名前をつけたい。
なにかいい名前はないものか。
娘の視力がまた下がったので、眼科へ。
待ち時間に娘は読書、私はPCを開けていろいろと。 しかし、ふと気がつくとキューに入れただけのはずのメールが配送されている。 知らない間に無線LAN接続していたらしい。FREESPOTか?
ま、ネットが使えるのはありがたいことではあるが。
This work is licensed under a Creative Commons License.
ちょっと思いついたので書きます。<br>1つめは、ちょっと長いですが「sandwich?」、<br>2つめは、「on_step?」または「on_stair?」<br>とかはどうでしょう?
allowance<br>coverage<br>gamut<br>interval<br>margin<br>radius<br>region<br>scope<br>spread<br>valspan // 僕の造語です。<br>within<br>zone<br>済みません、Rubyに関しては全くの素人です。m(_._)m 考えつく候補を挙げてみました。ご参考まで。
> beg <= x <= end<br>素直にwithinですかね。<br><br>> x.foo(beg,end)<br>通りすがりさんと同じですが on_step? in_step?あたりがいいと思います。
within は前置詞なので「range.within? val」はおかしい。「val.within? range」なら意味が通るが。<br><br>range.contain? val とか?
inとhasとかはどうでしょうか?<br><br>x.in?(beg, end)<br>range.has? val<br><br>てな感じで
> x.foo(beg,end)<br>range.steps_within?(beg, end) とか?<br>step に s をつけることで、動詞的イメージが高まる。
>> x.foo(beg,end)<br>>range.steps_within?(beg, end) とか?<br>>step に s をつけることで、動詞的イメージが高まる。<br>ごめんなさい。x.steps_within?(beg, end)ですね。
ひとつめはcover?かなと思いました.<br>ふたつめはやはりon_step?ですかね.
ひとつめは in_range_of、ちょっと長いですかね。<br>SQLのwhere句ではbetweenで表現していますね。<br>ふたつめは contains_in とか。
ruby-talk での話だから Redhanded に出さなくても良いですか?<br>もし英語圏の人が「名前」募集について知らないなら出すので、その時は ruby-talk の該当スレッドの id を教えてもらえると嬉しいです。
[ruby-talk:167182]です。<br>最初のものはcover?というのが琴線に響いたので採用しちゃいました。変えるかもしれないけど。<br>引き続きご意見募集中です。
way_to? とか。
ありがとうございます。今日はまだ早いんですけど、ちょっと具合が悪いので明日の夜出します。(遅すぎなきゃいいけど…)
1つ目はcover?に賛成。<br>2つ目は、辞書を引いた感じでは、x.trodden?とかなんですが、平易な単語のみでいくなら、x.touch_and_go?なんて、どうでしょう。
1つめは、embrace?、cover?、comprehend? を思いつきました。cover? はもう出てますね。<br><br>2つめは、シンプルに interval? はどうでしょう。2単語ならen_route? かなあ。on_the_way? は長すぎだし。
2つめが残ってますね。<br>through?というのは、簡単ではないでしょうか。
ちょっと思ったんですが、2つ目は<br> x.foo(beg..end)<br>という Range を引数にとる別パターンの記法を思いつくのですが、難しいのでしょうか? 展開されちゃう?
難しくはないですが、終端を含めるかどうかの処理をfooに押しつけるよりもRangeの中で解消したほうがよいかな(fooはいつも終端を含む判定をすればよい)と思っただけです。
x.foo(beg,end) は (beg..end).cover?(x) では<br>なにか不都合がありますか?<br><br>beg1 <= beg2 < end2 <= end1<br><br>class Range<br> def subset?(b, e=nil)<br> def superset?(b, e=nil)<br> alias :cover? :subset?<br> alias :within? :superset?<br> def <=> # -1, 0, 1, RangeError<br>end<br><br>range1 = beg1..end1<br>range2 = beg2..end2<br><br>range1.cover?(range1)<br>range1.cover?(range2)<br>range1.cover?(beg2, end2)<br>range1.cover?(beg2)<br>range1 > range2<br><br>range2.within?(range2)<br>range2.within?(range1)<br>range2.within?(beg1, end1)<br>range2 < range1
arimaさん:<br><br>cover?の中でbegとendの型によって分岐したくないのでダブルディスパッチを使いたかったわけです。