[#47414] <=>の意味は? — "T.Soejima" <clev@...2.so-net.ne.jp>

そえじま@勉強中です。

37 messages 2010/09/17
[#47420] Re: <=>の意味は? — 藤川浩明 <fhir0aki3@...> 2010/09/17

 他の方がすでに解答されているみたいですが、一応僕なりの答えを書いてみます。僕もRuby初心者なのではっきりとは言えないんですが・・・。

[#47422] Re: <=>の意味は? — "T.Soejima" <clev@...2.so-net.ne.jp> 2010/09/17

そえじま@勉強中です。

[#47424] Re: <=>の意味は? — "Y. NOBUOKA" <nobuoka@...> 2010/09/17

信岡です。

[#47426] Re: <=>の意味は? — "T.Soejima" <clev@...2.so-net.ne.jp> 2010/09/17

そえじま@勉強中です。

[#47428] Re: <=>の意味は? — "Y. NOBUOKA" <nobuoka@...> 2010/09/17

そえじまさん

[#47429] Re: <=>の意味は? — "T.Soejima" <clev@...2.so-net.ne.jp> 2010/09/17

そえじま@勉強中です。

[#47433] Re: <=>の意味は? — 藤川浩明 <fhir0aki3@...> 2010/09/18

GyRCISE/JyE5SlZFeiQ3JD8kJCRIO1ckJCReJDckPyQsISI7fjRWJCxMNSQkJE4kRyFWGyhCT09Q

[#47435] Re: <=>の意味は? — "T.Soejima" <clev@...2.so-net.ne.jp> 2010/09/18

そえじま@勉強中です。

[#47438] Re: <=>の意味は? — masayoshi takahashi <maki@...> 2010/09/18

高橋征義です。『たのしいRuby』の著者の片割れの方から来ました。

[ruby-list:47438] Re: <=>の意味は?

From: masayoshi takahashi <maki@...>
Date: 2010-09-18 02:11:58 UTC
List: ruby-list #47438
高橋征義です。『たのしいRuby』の著者の片割れの方から来ました。

# 第2版はどっかいった…と思ったらやっと発掘できたので参加します。

2010年9月18日9:55 T.Soejima <clev@ck2.so-net.ne.jp>:
> そういう意味で、突っ込んだ話になるとOOPは厄介なことを理解する必要が
> あるのかなぁ〜?と思っていたところです。

確かにOOPの方が厄介というか、おぼえることが増えるかもしれませんが、
それは「あとでラクをするために苦労する」みたいな話です。

いきなりComparableを使った定義だけを見ても「???」みたいな気持ちに
なるかもしれませんが、やりたいことは(『たのしいRuby』なら次の次のページ
に出てくる)book_test.rbみたいなことです。

ary = []
ary << Book.new(.....)
ary << Book.new(.....)
ary << Book.new(.....)
ary.sort.each{ |book|
  【ここで本の情報を出力】
}

このように、配列の要素をソートして出力したいわけです。
とはいえ、上ではさらっと「ary.sort」などとソートしてますが、もちろん
Bookはただの文字列や数値ではないため、ソート順を定義しないといけません。

で、たぶんご存知かと思いますが、ソートをするには大小比較ができる
ことが前提です。2つの本(Bookオブジェクト)を持ってきて、どっちが
大きいか小さいかの結果によってソートするので。

逆に言うと、大小比較用のメソッドさえ定義できれば、ソートも
自動的に定義されるとうれしいわけで。
これをできるようにするのが、RubyではComperableと<=>です。

<=>はもうすでに出てますが、上でいうところの「大小比較」を定義
してます。

本に載ってる例の骨子としては、

class Book
  include Comperative
  def <=>(other)
    【比較の定義】
  end

  ...その他いろいろ定義...

end

と、これだけで上に書いたようなsortメソッドがBookオブジェクトの
配列に対しても使えるようになるわけですね。

# ちなみに、otherというのは決まった用語でもないので、「x」とか「b」
# とか「other_book」とかでも構わないです。

さらに、ソートできるなら単純に大小比較もできるはずです。

a = Book.new(....)
b = Book.new(....)
if a < b
  【何かの処理】
end

みたいな感じですね。実はこれの「<」演算子も、上で書いたように<=>を
定義して、include Comperableをするだけで、自動的に定義されます。
おお、便利だ。さすがまつもとさん(いまさらながら賞賛してみる)。

# とはいえ、どうやって定義されてるの? と思うだろうというのを
# 予想して「こんな感じです」というのを書いてみたのが、このスレッド
# 冒頭の「<=」の定義なのでした。はい。まあ分かりにくいところかも。


何が簡単で何が面倒かは人によっても意見が分かれるかもしれませんが、
例えばBasicでは、いきなり「a < b」みたいな変数同士の比較とか、あるいは
ソートとかを、複雑なデータ構造に対してするのはできなかったと思います
(方言によってはそうじゃないかもしれませんが)。というか、こういうのが
できるようにするためには、データ構造自体が処理方法(手続き)を知っている
ことが必要になります。そのためのOOPですよ、というのが教科書的な説明です。


ちなみに宣伝ですが、OOPについては、『たのしいRuby第3版』では
第8章『クラスとモジュール』が(主にゆうぞうさんによって)大幅に
書き変わっています。selfについても「8.2.5 特別な変数self」で少し
詳しく説明しています(が、1ページ強なのでそんなに詳しくはない
です)。よろしければ書店等でさらっと見てみてください。

ついでに宣伝ではないですが、RubyでのOOPについて、ある程度腰を落ち着けて
がっつり勉強したい、ということであれば、artonさんと宇野るいもさんによる
『Ruby (3) オブジェクト指向とはじめての設計』(「(3)」は本当は丸付き数字)
が良いかもしれません。とりあえず本書の「はじめに」は「OOPは難しいかも?」
という人にはぜひ読んでいただきたい感動的な導入になっているので一読を
おすすめしたいです。

高橋征義 (maki@rubycolor.org)

In This Thread