🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: fj.lang.ruby
Article #1

differrence between Ruby and Python

#1
From: Shugo Maeda
Date: Mon, 02 Mar 1998 00:00
149 lines
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-mail
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>

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