Rubyとnil
世の中にはプログラミング言語はいろいろあるのですが、「何もない」という状態をどう扱うかというのは、とても特徴が出てくるところです。
例えばC言語では、言語的には0という整数が「何もない」ことを示していると言えます。例えば0は真偽値として扱うと偽になりますし、ポインタとしては「どこも指していない」という意味にすることが多いです。
Javaでは、nullが代入された変数を扱うとNullPointerExceptionという例外になるのですが、思わぬ形で大人気になってますね。
なんでこんな話を持ち出したかと言いますと、以前ruby-dev(Rubyの開発をしている人のためのメーリングリスト)でnilに関する激論があったのです。
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/29374
ここからスレッドを辿っていくと読むことができます。
ここで結局nil.to_sは空文字列を返すということで決着が付き、いろいろな人が胸を撫で下ろしたのですが、nilというものがどうあるべきかという議論はとても興味深いですね。
ちなみに、Rubyはとても柔軟な言語なので、こんな邪悪なこともできます。
class NilClassNilClassというのは、Rubyのnilオブジェクトが属するクラスで、インスタンスはnil一つのみという非常に特殊なクラスです。method_missingというのは、オブジェクトが応答できないメソッドが呼ばれたときに呼ばれるメソッドです。NilClassのmethod_missingがself(つまりnil)を返すようにすると何が起こるのか…と言いますと、nilに定義されていないメソッドが呼ばれてもnilが返るだけになるんですね。
def method_missing(id, *args)
self
end
endpeople = ["Mike", nil, "Tom", "Emily"]
p people.map {|person| person.upcase} => ["MIKE", nil, "TOM", "EMILY"]
Cで言うと、NULLのポインタに対して関数を呼ぶと例外にならずにNULLが返るだけ、ということになります。
7行目のようにnilが含まれる配列に対して8行目のような処理をすると、本来は例外が発生します。だけど、NilClassをいじっているので、この例では例外が起こりません。
これが一体何の役に立つのかというのは微妙なところですが、このスレッドの中でも紹介されているエラー忘却型コンピューティングに則ってシステムを作るときには良いのかもしれない、と思います。
思いもよらないことが起こったときに、システムを止めるのと何となく動くのではどちらがいいか…というときに、後者の方が良いことは結構ありますからね。
| 固定リンク
「パソコン・インターネット」カテゴリの記事
- 初音ミクの曲(動画)個人的な十選(2009.02.15)
- 2008年ニコニコ動画個人的ベスト10(2008.12.06)
- menucomplete.msのクラスメンバ補完を強化する(2008.07.21)
- ctagsをWin32環境でビルドする(2008.07.21)
- EeePC901の初期設定(2008.07.21)
この記事へのコメントは終了しました。
コメント