« Rubyのこのごろ | トップページ | 一息つきました »

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 NilClass
 def method_missing(id, *args)
  self
 end
end

people = ["Mike", nil, "Tom", "Emily"]
p people.map {|person| person.upcase} => ["MIKE", nil, "TOM", "EMILY"]

NilClassというのは、Rubyのnilオブジェクトが属するクラスで、インスタンスはnil一つのみという非常に特殊なクラスです。method_missingというのは、オブジェクトが応答できないメソッドが呼ばれたときに呼ばれるメソッドです。NilClassのmethod_missingがself(つまりnil)を返すようにすると何が起こるのか…と言いますと、nilに定義されていないメソッドが呼ばれてもnilが返るだけになるんですね。

Cで言うと、NULLのポインタに対して関数を呼ぶと例外にならずにNULLが返るだけ、ということになります。
7行目のようにnilが含まれる配列に対して8行目のような処理をすると、本来は例外が発生します。だけど、NilClassをいじっているので、この例では例外が起こりません。

これが一体何の役に立つのかというのは微妙なところですが、このスレッドの中でも紹介されているエラー忘却型コンピューティングに則ってシステムを作るときには良いのかもしれない、と思います。
思いもよらないことが起こったときに、システムを止めるのと何となく動くのではどちらがいいか…というときに、後者の方が良いことは結構ありますからね。

|

« Rubyのこのごろ | トップページ | 一息つきました »

「パソコン・インターネット」カテゴリの記事

コメント

コメントを書く



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




トラックバック

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

この記事へのトラックバック一覧です: Rubyとnil:

« Rubyのこのごろ | トップページ | 一息つきました »