« 2007年10月 | トップページ | 2008年3月 »

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をいじっているので、この例では例外が起こりません。

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

| | コメント (0) | トラックバック (0)

Rubyのこのごろ

年の瀬が迫り、そろそろみんなが今年はどういう年だったかというような話をし始める頃ですが、Ruby界隈ではまだまだ大変な事件が待ちかまえています。来る12月25日は、Rubyist念願のRuby1.9リリース日なのです!
ここ数年間、Rubyの主要な機能追加はこの1.9ブランチ(と言うかトランク)に対して行われてきたわけで、その変更はまさに膨大です。まつもとさんがruby-devに投稿したリストを見て、

[ruby-dev:32385] Re: 1.9.1のリリース時期について

ワクテカしないRubyistはいないでしょう。
変更が大きい分まだバグも多く、すぐに使えるような安定したリリースではなさそうですが、お正月にいろいろ遊んでみるのにはもってこいではないでしょうか。

このリリースを前にして、rubyの各種メーリングリストでは非常に活発な投稿が行われています。Ruby関連のメーリングリストは、bladeと呼ばれるシステムでアーカイブされていて誰でも読むことができます。
日本のトップレベルのプログラマ達が、真剣に実装や仕様について討論している姿はとても迫力があるし、単純に読み物として面白いです。Rubyに関する新しい発見もありますしね。

最近ちょっと驚いたのは、

http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/281507

で紹介されているtestという組み込み関数でした。これは存在自体知らなかったです。長いこと使ってても、全然知らない関数とかあるものですね。

| | コメント (2) | トラックバック (0)

« 2007年10月 | トップページ | 2008年3月 »