From: sekita-n@... (Sekitani Nobutaka) Date: 1999-03-17T22:05:02+09:00 Subject: [ruby-list:12963] seqcmp.rb 関谷@電通大です。 比較演算子をPythonのように連結できるようにする seqcmp.rb を作りました。(signatureの下にあります) デフォルトでは使用頻度が高いと思われるNumeric系統とStringクラスについて の実装ですが、他の<=>を定義しているクラスでも正常に動作すると思います。 (例) 「a < b <= c」は、「a < b && b <= c」のとき真となる。 (如何にして実装したか?) 1)FalseClassに比較演算子(==を除く、以下同様)を定義。これらは常に falseを返すものとする。 2)Numeric,Stringでの比較演算子を再定義。比較が正しければ右辺を、 正しくなければfalseを返す。 比較演算子が論理値しか返さないのがもったいないということで今日一日で考 えたんですが、かなり強引で汚い実装ですね。 その上Ruby本体のソースをいじることまで考えてたりします。^^; ヤバい点とか、もっと簡単にできる方法とか、あとファイル名適当なのでもっ といい名前とかあったらどうぞ突っ込んでください。 では。 P.S. Pythonのインデントを使う文法はSKKのごとき簡素さ(個人的主観)で画期的ですね。 他はどうでもいいですが。(爆) --- 電気通信大学 情報工学科 4年 |% 予習 関谷 信貴(せきたに のぶたか) |file system full. e-mail sekita-n@hera.im.uec.ac.jp |% 授業 Webpage http://pluto.im.uec.ac.jp/~sekita-n/ |file system full.;_; ↑シュミ特、Fanroad N-BBSなど |system downed... ---Cut Here =begin seqcmp.rb 比較演算子を連続的に利用するためのライブラリ v0.00 by sekita-n@hera.im.uec.ac.jp (例) require("seqcmp") a = 1 b = 2.5 c = 3 p a < b <= c =end module SeqComparable Eval_Methods = <<"EOF" def < (o); ((self <=> o).lt(0)) ? o : false; end def <=(o); ((self <=> o).le(0)) ? o : false; end def > (o); ((self <=> o).gt(0)) ? o : false; end def >=(o); ((self <=> o).ge(0)) ? o : false; end EOF end class Integer alias lt <; alias le <=; alias gt >; alias ge >=; end class FalseClass def < (o); false; end def <=(o); false; end def > (o); false; end def >=(o); false; end end class Fixnum module_eval(SeqComparable::Eval_Methods) end class Bignum module_eval(SeqComparable::Eval_Methods) end class Float module_eval(SeqComparable::Eval_Methods) end class String module_eval(SeqComparable::Eval_Methods) end ---Cut Here