[#41455] オブジェクト同士の演算などを実装するには? — Hideo Konami <konami@...>

小波です.

24 messages 2005/11/02
[#41457] Re: オブジェクト同士の演算などを実装するには? — rubikitch <rubikitch@...> 2005/11/02

From: Hideo Konami <konami@kyoto-wu.ac.jp>

[#41459] Re: オブジェクト同士の演算などを実装するには? — Hideo Konami <konami@...> 2005/11/03

小波です.

[#41461] Re: オブジェクト同士の演算などを実装するには? — IWAOKA Masahiro <iwaoka@...> 2005/11/03

いわおかです。

[#41489] Matrixの継承について — argento@...

はじめまして。吉田と申します。

25 messages 2005/11/06
[#41495] Re: Matrixの継承について — Yukihiro Matsumoto <matz@...> 2005/11/06

まつもと ゆきひろです

[#41497] Re: Matrixの継承について — "T.Y" <argento@...> 2005/11/07

るびきち様、まつもと様

[#41499] Re: Matrixの継承について — keiju@... (石塚圭樹) 2005/11/07

けいじゅ@いしつかです.

[#41529] Re: Matrix の継承について — Shin-ichiro HARA <sinara@...> 2005/11/12

原です。

[#41535] Re: Matrix の継承について — keiju@... (石塚圭樹) 2005/11/14

けいじゅ@いしつかです.

[#41536] Re: Matrix の継承について — Yukihiro Matsumoto <matz@...> 2005/11/14

まつもと ゆきひろです

[#41537] Re: Matrix の継承について — keiju@... (石塚圭樹) 2005/11/14

けいじゅ@いしつかです.

[#41538] Re: Matrix の継承について — Yukihiro Matsumoto <matz@...> 2005/11/14

まつもと ゆきひろです

[#41503] 数を減らしてくループ — Takeshi Horinouchi <horinout@...>

堀之内と申します。

13 messages 2005/11/08

[#41602] エクセルファイルを読み込む際の問題(質問) — "Hisashi Yahata" <yahatah@...>

質問で恐縮ですが、ご教示ください。

14 messages 2005/11/28

[#41624] MacOS X Aqua 対応のための tcltklib の extconf.rb — Hidetoshi NAGAI <nagai@...>

永井@知能.九工大です.

26 messages 2005/11/30
[#41625] Re: MacOS X Aqua 対応のための tcltklib の extconf.rb — Hidetoshi NAGAI <nagai@...> 2005/12/01

永井@知能.九工大です.

[#41627] Re: MacOS X Aqua 対応のための tcltklib の extconf.rb — 天野 竜太郎 <wn9r-amn@...> 2005/12/01

天野竜太郎と申します。

[#41636] Re: MacOS X Aqua 対応のための tcltklib の extconf.rb — Hidetoshi NAGAI <nagai@...> 2005/12/02

永井@知能.九工大です.

[#41637] Re: MacOS X Aqua 対応のための tcltklib の extconf.rb — 天野 竜太郎 <wn9r-amn@...> 2005/12/02

8.4.10のtcl.hやtk.hは、

[#41644] Re: MacOS X Aqua 対応のための tcltklib の extconf.rb — Hidetoshi NAGAI <nagai@...> 2005/12/03

永井@知能.九工大です.

[#41646] Re: MacOS X Aqua 対応のための tcltklib の extconf.rb — 天野 竜太郎 <wn9r-amn@...> 2005/12/03

> Tcl/TkAqua もこの Macintosh のルールに従うのであれば

[#41647] Re: MacOS X Aqua 対応のための tcltklib の extconf.rb — Hidetoshi NAGAI <nagai@...> 2005/12/03

永井@知能.九工大です.

[#41649] Re: MacOS X Aqua 対応のための tcltklib の extconf.rb — Hidetoshi NAGAI <nagai@...> 2005/12/03

永井@知能.九工大です.

[#41650] Re: MacOS X Aqua 対応のための tcltklib の extconf.rb — 天野 竜太郎 <wn9r-amn@...> 2005/12/04

天野です。

[#41651] Re: MacOS X Aqua 対応のための tcltklib の extconf.rb — Hidetoshi NAGAI <nagai@...> 2005/12/04

永井@知能.九工大です.

[#41653] Re: MacOS X Aqua 対応のための tcltklib の extconf.rb — 天野 竜太郎 <wn9r-amn@...> 2005/12/04

[#41658] Re: MacOS X Aqua 対応のための tcltklib の extconf.rb — Hidetoshi NAGAI <nagai@...> 2005/12/04

永井@知能.九工大です.

[#41663] Re: MacOS X Aqua 対応のための tcltklib の extconf.rb — 天野 竜太郎 <wn9r-amn@...> 2005/12/04

完全に私の勘違いです。

[#41664] Re: MacOS X Aqua 対応のための tcltklib の extconf.rb — Hidetoshi NAGAI <nagai@...> 2005/12/05

永井@知能.九工大です.

[#41665] Re: MacOS X Aqua 対応のための tcltklib の extconf.rb — 天野 竜太郎 <wn9r-amn@...> 2005/12/05

ruby-list:41651の

[ruby-list:41471] Re: オブジェクト同士の演算などを実装するには?

From: nakamura <BXQ04723@...>
Date: 2005-11-03 17:09:05 UTC
List: ruby-list #41471
お世話になっております。 A.中村です。

On Thu, 3 Nov 2005 13:56:13 +0900
IWAOKA Masahiro様 iwaoka@tuat.jac-net.com wrote:

> オブジェクトを主体として考えるならば、第三者(Cat)によって戦わさ
> れてる(上の例)というよりは、"mike" が "tama" と戦う(例えば
> mike.fight(tama))の方が自然だと思います。baby の例も同様。


mike.fight_with(tama)
#「hogehogeと戦う」が英語ではFight WITH hogehogeだったかどうかは
#自信が無いですが…

というメソッドは存在していいと想いますが、
それとは別問題として、
「両者を対等に捉えたい」っていう要望もまた
アリだとは想います。

主体といっても、現実は、
これが主体だ!と言い切れるケースばかりじゃないので、
ちょっと微妙なんですよねー。

なんか世間にはMultipleDispatchとかいって
複数のオブジェクトの「組み合わせ」に対して
メソッドを呼ぶ(メッセージを送信する)ということが
できる言語もあるらしいです。
#Lisp系とかで見かけるらしいですが、
#かくいう俺も触ったことはまだ無いので伝聞です…
そういう言語だと、
対等に捉えたfightも自然に記述できるんでしょうね。

が、まあ今主流の言語にはその機能は無いようです。

MultipleDispatchなやり方だと、もしかすると、
闘技場とか、戦う動機とか、戦う種目とか、もまた
組み合わせるオブジェクトたちの1つとして参加する
のかなあ…



さてRuby。
個人的には、ArrayとかEnumerableに
ちょいとfightメソッドをつけちゃうといいかな
という気がしています。

Arrayに恒久的につけるのは不味いでしょうけど、
まあ1つのプログラムの中の話ですし、
かたいこと言わずに(^^;

…てゆーか、Enumerableと同じ立場の
(つまりeachとかを持つクラスにincludeしてもらうような)
moduleを1つ作ればいいんですかね。

#EnumerableとかArrayとかにmix-inしてくださーい
module Fighters
  #要素がfight_with(敵)を受け付けることを期待してまーす
  def fight
    self.each{|me|
      (self.to_a - [me]).each{|enemy|
        me.fight_with(enemy)
      }
    }
  end
end

module Fighter
  def initialize(name)
    @name=name
  end
  attr :name
  def fight_with(you)
    puts "#{self.name}曰く「#{you.name}よ、俺はお前を倒す!!」"
    #相手次第で戦い方を替える、というコードが何もありませんが…(^^;
    #あと動機や種目の概念も無いなあ。うーん…
  end
end

class Cat; include Fighter; end
class Dog; include Fighter; end

[
  Cat.new("mike"),
  Cat.new("tama"),
  Dog.new("pochi"),
].extend(Fighters).fight

sh-2.04 % ruby -v fighters.rb
ruby 1.8.2 (2005-02-01) [i386-mswin32]
mike曰く「tamaよ、俺はお前を倒す!!」
mike曰く「pochiよ、俺はお前を倒す!!」
tama曰く「mikeよ、俺はお前を倒す!!」
tama曰く「pochiよ、俺はお前を倒す!!」
pochi曰く「mikeよ、俺はお前を倒す!!」
pochi曰く「tamaよ、俺はお前を倒す!!」


まあようするに
「不細工」な部分はライブラリ(?)の中に隠しちゃえ
という話です。

あと、extendでヤリ逃げするってのは結構好きかも。
module自体はライブラリとして作り置きできるんで
クラスじゃなくインスタンスに対してちょっかい出しても
全体としてはあまり汚くならない(きがする)し。



In This Thread