kiyoka.2009_03_21 RSSPLAIN

Related pages: !kiyoka.blog.list !kiyoka.blog.2009_03
545455555555555555555555555555555555554553215
5

[Ruby] Rubyのよくわからない挙動(1)

4

===メソッド(比較演算子)の挙動がよくわからない。

5

クラス A を定義し、インスタンスを a に代入する。

4
$ irb
5
>> class A ; end
5
class A ; end
5
=> nil
5
>> a = A.new
5
a = A.new
5
=> #<A:0x3637ec>
5

 

5

== がtrueになるのはわかる。

5
>> a.class == A
5
a.class == A
5
=> true
5

 

5

=== では何故falseになるのか。

5
>> a.class === A
5
a.class === A
5
=> false
5

 

5

=== がtrueになってくれないと === 演算子が適用される case 〜 when が使えない。

5

例えば、

5
  case val.class
5
  when Cell
5
    Cell型の場合の処理
5
  when Fixnum
5
    Fixnum型の場合の処理
5
  end
5

という記述はダメ。どれにもマッチしない。

5

 

5

こう書けばいけるけど、ちょっと苦しい。

5
  case val.class.to_s
5
  when "Cell"
5
    Cell型の場合の処理
5
  when "Fixnum"
5
    Fixnum型の場合の処理
5
  end
4

 

5

こんな場合Rubyの定石として、どう書くんだろう。

5

 

3

COMMENTGrape

勉強し始めたばかりなので、まだ何とも言えませんが、

Rubyの===は、「サブクラスで適宜再定義される」とあるので、オブジェクトによって挙動が違う可能性があります。

つまり、実装によっては必ずしも型が同じで値が同じ時にTrueという動きではないかもしれません。

的外れな答えでしたら、すみませんorz

2

COMMENTmogya

>こんな場合Rubyの定石として、どう書くんだろう。

こうらしいです。

 case val

  when Cell

    Cell型の場合の処理

  when Fixnum

    Fixnum型の場合の処理

  end

[ruby-list:10473]case with Class からはじまる一連のスレッドに書いてありました。

http://blade.nagaokaut.ac.jp/cgi-bin/vframe.rb/ruby/ruby-list/10473?10428-11968

1

COMMENTkiyoka

Grapeさん、mogyaさん、コメントどうもです。

mogyaさんに教えてもらった方法でいけそうです。

内部の仕組みはよくわかりませんが、これで短く書けますね。(そのへんがRubyに対して好みがわかれるところでしょうが...)

以下、実験結果です。

irb(main):001:0> class A ; end

=> nil

irb(main):002:0> a = A.new

=> #<A:0x4023c478>

irb(main):003:0> case a

irb(main):004:1> when A

irb(main):005:1> 1

irb(main):006:1> when B

irb(main):007:1> 2

irb(main):008:1> else 

irb(main):009:1* 3

irb(main):010:1> end

=> 1

今作っているLispインタプリタをこのスタイルに直しておきますです。

5

...comment disabled...