[#19457] equality between "a" and Exception.new("a") — Tanaka Akira <akr@...17n.org>

ふと気がついたのですが、

39 messages 2003/02/02
[#19460] Re: equality between "a" and Exception.new("a") — matz@... (Yukihiro Matsumoto) 2003/02/03

まつもと ゆきひろです

[#19473] Re: equality between "a" and Exception.new("a") — Tanaka Akira <akr@...17n.org> 2003/02/04

In article <1044245817.592933.31973.nullmailer@picachu.netlab.jp>,

[#19474] Re: equality between "a" and Exception.new("a") — matz@... (Yukihiro Matsumoto) 2003/02/04

まつもと ゆきひろです

[#19475] Re: equality between "a" and Exception.new("a") — Tanaka Akira <akr@...17n.org> 2003/02/04

In article <1044329220.257740.28127.nullmailer@picachu.netlab.jp>,

[#19476] Re: equality between "a" and Exception.new("a") — matz@... (Yukihiro Matsumoto) 2003/02/04

まつもと ゆきひろです

[#19477] Re: equality between "a" and Exception.new("a") — Tanaka Akira <akr@...17n.org> 2003/02/04

In article <1044331431.138035.28173.nullmailer@picachu.netlab.jp>,

[#19478] Re: equality between "a" and Exception.new("a") — matz@... (Yukihiro Matsumoto) 2003/02/04

まつもと ゆきひろです

[#19479] Re: equality between "a" and Exception.new("a") — Tanaka Akira <akr@...17n.org> 2003/02/04

In article <1044332948.099873.28206.nullmailer@picachu.netlab.jp>,

[#19482] Re: equality between "a" and Exception.new("a") — matz@... (Yukihiro Matsumoto) 2003/02/04

まつもと ゆきひろです

[#19486] Re: equality between "a" and Exception.new("a") — Tanaka Akira <akr@...17n.org> 2003/02/04

In article <1044338964.502066.28474.nullmailer@picachu.netlab.jp>,

[#19491] Re: equality between "a" and Exception.new("a") — matz@... (Yukihiro Matsumoto) 2003/02/04

まつもと ゆきひろです

[#19493] Re: equality between "a" and Exception.new("a") — matz@... (Yukihiro Matsumoto) 2003/02/04

まつもと ゆきひろです

[#19556] compare between String and Exception — Tanaka Akira <akr@...17n.org> 2003/02/12

さらに気が付いたのですが、

[#19514] [Oniguruma] Version 1.7.1 — "K.Kosako" <kosako@...>

ftp.ruby-lang.orgに、onigd20030207.tar.gzを置きました。

19 messages 2003/02/07

[#19548] [PATCH] file.c for (PR#389) and (PR#390) — nobu.nakada@...

なかだです。

20 messages 2003/02/11
[#19572] Re: [PATCH] file.c for (PR#389) and (PR#390) — pegacorn@... 2003/02/14

From: nobu.nakada@nifty.ne.jp

[#19648] Re: SEGV at search_method in eval.c (PR#400) — nobu.nakada@...

なかだです。

13 messages 2003/02/24

[ruby-dev:19558] Re: compare between String and Exception

From: Tanaka Akira <akr@...17n.org>
Date: 2003-02-13 07:28:05 UTC
List: ruby-dev #19558
In article <1045117653.309213.10735.nullmailer@picachu.netlab.jp>,
  matz@ruby-lang.org (Yukihiro Matsumoto) writes:

> うーん、==と違って > などや <=> はすべてのオブジェクトで定義
> されていないので「同様の仕掛け」でうまくいく自信がありません。
> 「似たような」だと可能なものもあるかもしれませんが、すぐには
> 思いつきません。

定義されてなかったら両方とも例外になるということを想定しています。

つまり、String#<=> で、引数 arg が to_str を持っていてかつ T_STRING で
ない場合には単に -(arg <=> self) みたいな感じの評価を行い、その <=> の
呼び出しが例外になったらそのまま例外にするというわけですが。

どんなもんでしょう?

ちなみに、Pathname で、いきがけ順の順序を導入しようと思ったんですが、
String と比較不能にできないかなぁ、と思ったのがきっかけです。

> あと、現在、Comparableで定義されている比較演算子が比較が成立
> しない場合に偽を返すのは仕様のつもりです。この仕様が(対称性
> の観点から)妥当でないのではないかという議論は歓迎します。

えーと、確認ですが、「Comparableで定義されている比較演算子」ってのは <
とかですよね。で、「比較が成立しない」ってのは <=> が nil を返すことで
すよね。さらに、「偽」ってのは(少なくとも現時点の実装としては) false
のことですね。で、偽を例外にするのはどうかという話ですよね。

まぁ、とりあえず false よりは nil のほうが区別できるぶんましなんじゃな
いかという気はします。どっちも偽だから互換性へのインパクトは最小限だし。

さて、それを例外にすべきかというと... どうでしょうね。
たしかに、レシーバが < などを持っていない場合には偽を返すことができな
いので、対称性を保つためには Comparable#< などでも偽よりは例外のほうが
適切なのかもしれません。でも、Comparable#< で NoMethodError を出すのは
変なので、例外の種類は変わりますよねぇ。

... あー、Comparable#< には nil の検査が入ってないみたいです。

% ruby -e '
class C
include Comparable
def <=>(arg) nil end  
end
p C.new < nil'
-e:6:in `<': undefined method `>' for nil (NoMethodError)
        from -e:6

あと、非対称なのはまだまだありそうです。

% ruby -e 'p 1 <=> []'
nil
% ruby -e 'p [] <=> 1'
-e:1:in `<=>': cannot convert Fixnum into Array (TypeError)
        from -e:1

% ruby -e 'p 1 <=> Time.now'
nil
% ruby -e 'p Time.now <=> 1'    
1
-- 
[田中 哲][たなか あきら][Tanaka Akira]

In This Thread