Article View: fj.lang.ruby
Article #1differrence between Ruby and Python
From: Shugo Maeda
Date: Mon, 02 Mar 1998 00:00
Date: Mon, 02 Mar 1998 00:00
149 lines
7103 bytes
7103 bytes
前田です。
suzuki@otsl.co.jp (SUZUKI Hisao) wrote:
|>Mixinや特異メソッドのことかと思って一瞬びっくりしました。
|>クラスもオブジェクト...という部分ですね。
|
|いえいえ,全部についてです。
やはりちょっと違うという印象を受けました。
# どちらが良いかという問題は別にして。
|Python は Mixin よりも一般的で強力な (したがって誤用,乱用の
|危険もまた大きい) 多重継承をサポートしています。
fjでも何度もいっているのですが、RubyのMixinシステムの特長は言語
としてMixinを強制している点です。
多重継承ができれば、Mixinをコーディングスタイルとして利用できる、
というのは当たり前ですよね。
|Python は特異メソッドに相当することも可能です。(a) 各インス
|タンスは属性を随意に設けることができる,(b) 関数も値として使
|える,という二つの規則からの簡単な系です。たとえば
|
| def foo(a):
| def bar(x, self=a): print "<%s, %s>" % (self, x)
| a.f = bar
|
|という関数はインスタンス a に f という (事実上の) 特異メソッ
|ドを設けます (ここで入れ子関数の名前 bar は,a.f 自身のほか
|は関数 foo だけが知っています。名前空間の汚染はありません)。
なるほど、関数がfirst class objectだとこういうこともできるん
ですね。
Rubyの場合は特異メソッドは言語で規定されていて、
obj = Object.new
def obj.foo
print "foo\n"
end
のようにします。
クラスメソッドを定義する時はRubyではクラスオブジェクトの特異
メソッドを定義します。
|クラスもオブジェクトということについては,より正確にいえば,
|普通はクラスは (メタクラスの) インスタンスではないが,もしそ
|うしたければそうすることもできる,ということです。
僕が「クラスもオブジェクト」という言葉で表現したかったのは
Rubyがpureなオブジェクト指向言語である、ということでした。
結局僕がPythonよりRubyの方が好きなのはRubyはpureでPythonは
hybridだからなんですよね。
|>|# ただイテレータは Python ではごく制限された形態しかありません。
(snip)
|もっとも,ここで自分が念頭に置いていたのは for 文のことです。
|__getitem__ メソッドあるいはその名前の属性を適切に定義すれば,
|任意のインスタンスを for 文による繰返しにかけることができま
|す。この場合,自由変数うんぬんの問題はありませんが,繰返しの
|形態は for 文のそれに限るという制限を受けます。
なるほど、forのことでしたか。
|# イテレータ・ブロックをあらわす疑似変数を疑似仮引数として
|# メソッド定義の仮引数並びの次にでも明記するようにし,yield
|# もその疑似仮引数の関数呼出しとして表現すれば,より直感的
|# だったはずです。(そもそも yield という名前は,先行する諸
|# 言語で使われていた意味からのいらぬ誤解を招くので,かなり
|# 適切さに欠けるのではと思います)。
yieldはCLUから取ったんだと思うんですが。
|ところで,ruby でいう「イテレータ」,もとのアイディアは ETH
|Oberon-2 の
|
|H. M"ossenb"ock: Treating Statement Sequence as Block Objects,
|ACM SIGPLAN Notices, vol.27, no.8 (August 1992), pp.83-86.
|
|かとも察しますが,いかがでしょうか? >まつもとさん
|それとも独立して考案されたのでしょうか。
CLUのイテレータからforを分離したのだと思います。
|たとえば ruby が and や if の条件での正規表現リテラルを
|
| $_ =~ リテラル
|
|と見なすのは,特定の用途 (awk や Perl と同様の用途) には便利
|でしょう。しかし,ruby では,FALSE と nil 以外は真と見なすと
|いうルールがあるのですから,この場合,恒真でないのは一貫性の
|破綻ともいえます。これは汎用言語としては失点です。
=~はStringのメソッドでマッチしなかったらfalseを返すから
全然問題ないです。
他のクラスで
class Foo
def =~(arg)
...
end
end
のようにオーバーライドしても問題ないです。
|>rbc.rbという対話的にRubyの式を評価できるプログラムがあります。
|>対話的に処理する時はインデントしなくていい分Rubyの方が楽かもしれ
|>ませんね:-)
|
|手もとの LINUX JAPAN vol.6 に入っている版の ruby には入って
|いないようです。ただ,もしあったとしても,いくつか難点が予想
|されます。以下の点はどうでしょうか?
|
|(1) Python を python -i ファイル名 のように起動すると,
| ファイルをスクリプトとして実行後,対話処理に入ります。
| これはスクリプトを途中まで書いて,残りはその場その場の入力で
| 試行錯誤するのに重宝します。
| こういったことはできるのでしょうか?
| (スクリプト・ファイルを実行できるだけでは不十分です。
| まっさらな環境からの試行が1ステップで手軽にできることが
| 重要です)
デバッグ目的ならソースレベルデバッガがありますが、そういう
目的のものでしょうか?
|(2) Python の dir() 呼出しは,現在定義されている変数等の一覧を
| 返します。dir(引数) 呼出しは,その引数 (モジュールなど) の中
| で定義されている変数等の一覧を返します。
| 関数名を忘れたときなど,マニュアルをひくまでもなく,この一覧
| を見て確認すれば済むことがしばしばあります。
| こういったことはできるのでしょうか?
Rubyだとクラスオブジェクトにメッセージを送って調べます。
|(3) Python のモジュールやクラス,メソッド等,とりわけ,最近追加
| されてなじみのない (マニュアルを読みたくなるような) ものは,
| __doc__ 属性による説明文書が用意されています。
| これらは,マニュアルをひくまでもなく print 引数.__doc__ と
| することで,その場ですぐ説明を読むことができます (英語ですが)。
| こういった便宜はあるのでしょうか?
自分でライブラリをそう設計すれば同じことはできるでしょうが、
システムレベルでは用意されていません。
--
前田 修吾
Technical Details
Message-ID:
<86pvk5n147.fsf_-_@soleil.localnet.or.jp>Path:
arc1-ca.pugleaf.net!unknown!not-for-mailReferences:
<864t1qerg8.fsf@soleil.localnet.or.jp> <7szpjgjw41.fsf@sdd.tokyo-sc.toshiba.co.jp> <86sop8fall.fsf@soleil.localnet.or.jp> <SUZUKI.98Feb26123600@oz.otsl.oki.co.jp> <86u39mptwb.fsf@soleil.localnet.or.jp> <SUZUKI.98Mar2082701@oz.otsl.oki.co.jp>Show Full Headers
Complete Article Headers
X-Google-Language: Japanese,JIS X-Google-Thread: 110fd3,a9d91ab6e74b73d5,start X-Google-Attributes: gid110fd3,public X-Google-Thread: 10b195,a9d91ab6e74b73d5,start X-Google-Attributes: gid10b195,public X-Google-Thread: 13488f,68272ddf24459300 X-Google-Attributes: gid13488f,public From: shugo@po.aianet.ne.jp (Shugo Maeda) Subject: differrence between Ruby and Python Date: 1998/03/02 Message-ID: <86pvk5n147.fsf_-_@soleil.localnet.or.jp> X-Deja-AN: 329911258 References: <864t1qerg8.fsf@soleil.localnet.or.jp> <7szpjgjw41.fsf@sdd.tokyo-sc.toshiba.co.jp> <86sop8fall.fsf@soleil.localnet.or.jp> <SUZUKI.98Feb26123600@oz.otsl.oki.co.jp> <86u39mptwb.fsf@soleil.localnet.or.jp> <SUZUKI.98Mar2082701@oz.otsl.oki.co.jp> Content-Type: text/plain; charset=ISO-2022-JP X-Emacs: Emacs 20.2, MULE 3.0 (MOMIJINOGA) Organization: AIANet Internet Service Mime-Version: 1.0 (generated by SEMI MIME-Edit 0.100 - "Otomaru") Newsgroups: fj.lang.ruby,fj.lang.misc,fj.comp.oops