« Project Euler : Problem 21 〜 友愛数 | トップページ | Project Euler : Problem 22 »

2010年4月29日 (木)

人のブログの間違いが気になって……

 基本的に、ほかの人のブログの内容に口を出すのは好きじゃないんですが、どうしても気になることがあるので……。

 

 先日、Ruby に関するこんな記事を見かけました。

Rubyでは、すべてがオブジェクト。じゃないよ!

 この記事を書いた人は、Ruby の根本的なところで勘違いをしているようです。
 ある程度 Ruby や「オブジェクト指向プログラミング」について知識にある人ならすぐに分かる間違いなので、「そのままスルーしてもいいかな?」とも思ったのですが、もし Ruby のことをよく知らない人が読んだら混乱するのではないかと心配になったので、この記事を書くことにしました。

 問題の記事では、冒頭にこんなことが書いてあります。

 Rubyでは、すべてがオブジェクト。と説明される場合があります。確かに、「1」も「+」もクラス自体もすべてオブジェクトです。ですが、「ほぼ」すべてがオブジェクトであって、すべてではないんです。
 例をひとつ。ブロックはオブジェクトではありません。
 確かに Ruby では「すべてがオブジェクトである」と表現されることがあります。しかしこの場合の「すべて」は「すべてのデータ(例えば、文字列、配列など)」という意味になります。
 Ruby には「オブジェクト」以外に「オブジェクト」に属する「メソッド(例えば、 Array#size など)」や「制御構造(例えば、 if や while など)」なども含まれます。そして、一部のメソッド(%, + など)や制御構造(and, or など)は、「演算子」の形をとっています。
 上の文章の例で言えば、「1」はオブジェクトですが、「+」はメソッドです。また「ブロック」は制御構造ということになります。

 さらに記事の最後には

 このように、ブロックはオブジェクトではありません。他にRubyでもオブジェクトでないものに、「and」や「or」、「&&」や「||」などがあります。演算子が特別なのは当たり前だろと思う人は、LISPを調べてみると面白いかもしれません。
といった文章が書いてあります。
 すでに書いたように「ブロック」は制御構造です。「and」、「or」、「&&」、「||」も制御構造です。
 それから、LISP が引き合いに出されていますが、文章の流れからすると「LISP の演算子はすべて手続きである」といったことを表現したかったのでしょうか?
 確かに LISP ほとんどの演算子は手続きといっていいのですが、「and」や「or」など一部の演算子は、引数の評価を通常の手続きと同じようにしてしまうと異常事態に陥る可能性があるため、通常の手続きとは引数の評価のタイミングが違うマクロとして実装されているのが普通です。

 インターネット上のホームページやブログを見ていくと、簡単にいろいろな情報を手に入れることができます。しかし、中には不正確だったり、間違った情報もたくさんあります。
 正しい情報のみをふるい分けるのはなかなか難しいですけどね……。いろいろな記事を見比べたり、人に話を聞いたり、正しい情報を得るにはそれなりに努力が必要ってことでしょうか……。
 かくゆう私のブログの記事も、「思い込み」や「勘違い」で間違った情報を書いている可能性は十分にあります。記事の内容をあんまり鵜呑みにしないほうがいいかも……。

« Project Euler : Problem 21 〜 友愛数 | トップページ | Project Euler : Problem 22 »

Ruby」カテゴリの記事

日記・コラム・つぶやき」カテゴリの記事

コメント

はじめまして、shunsukです。
ありがとうございます!

ひとつ質問させてください。
「Ruby の根本的なところで勘違い」とありますが、
どこを勘違いしているのかを理解できていません。

一人前のRubyistになりたいので、ぜひご指摘ください。

shunsuk さんへ

私が「根本的な間違い」といったのは、「オブジェクト」、「メソッド」、
「制御構造」といった、Ruby を構成する基本的な要素に対する理解が間違っ
ているということです。

本文にも書きましたが、「1」はオブジェクトですが「+」はメソッドで、オブ
ジェクトではありません。

もし Ruby と深く付き合っていくつもりなら、「オブジェクト指向プログラミ
ング」に対する正確な知識が必要になってくると思います。「オブジェクト」、
「メソッド」といったものの意味や役割の理解が曖昧なままだと、プログラミ
ングをしていく上で変なところでつまづいたり、思わぬバグの元になる可能性
があると思います。

あれ?「+」もオブジェクトですよね?

1.method(:+).class #=> Method

Rubyでは、クラスもメソッドもオブジェクトだと思いますが。

「オブジェクト」、「メソッド」といった言葉の意味をしっかり理解できてい
ますか?

「オブジェクト指向スクリプト言語 Ruby」のホームページにあるマニュアル
(http://doc.okkez.net/static/191/method/Object/i/method.html) によれば
"Object#method(name)" は「オブジェクトのメソッド name をオブジェクト化
した Method オブジェクトを返します」となっています。

したがって "1.method(:+)" という処理で「+」というメソッドがオブジェク
ト化されただけです。あくまでも「+」自身はオブジェクトではなく、メソッ
ドに過ぎません。

なるほど!!
RubyはPythonと違って、メソッドはオブジェクトではないんですね。
ありがとうございます。勉強になりました。
ブログの方も修正しておきます。

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/112020/48215853

この記事へのトラックバック一覧です: 人のブログの間違いが気になって……:

« Project Euler : Problem 21 〜 友愛数 | トップページ | Project Euler : Problem 22 »

2016年7月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            
フォト

最近のトラックバック

無料ブログはココログ