フォーチュンサモナーズ
«前の日記(2006-03-13) 最新 次の日記(2006-04-01)» 編集

Don'tStopMusic

2003|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|12|
2006|01|02|03|04|05|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|08|09|10|11|

カテゴリ別 2003年 | 2004年 | 2005年 | 2006年 | 2007年 | 2008年

知り合いサイト: よんだもの / 暴想 / Linuxでやる夫 / 新宿Vipper / 僕だけが幸せになればいいのに。


2006-03-19

_ [Ruby] 真偽の扱い このエントリーを含むブックマーク

%!zt! diary(2006-03-17) 偽値

どちらかというと0が偽として見なされる方が見落としてバグになる可能性が高い気がする。plumの罠の話とか。

これは思いますね。Perl などで条件式に変数を入力があるかないかの意味で書くとたまにはまります。

Perl と Ruby と真偽の扱いが異なる点は、空文字列を偽とする、0 (と "0"。Perl は区別しないけど)を偽とするところです(他あったかな)。

Ruby では値が入力されているかを確かめるために、

if input and not input.empty?
  p input
end

と書いたりします。input が nil でなく(=存在している)、かつ空ではない(=入力されている)という意味です。empty? メソッドは Array、Hash、String といった基本的なデータ型クラスのオブジェクトが持っています。特に入力には String が使われることが多いので、上のようなイディオムが良く使われます。rails では Object#blank? として定義されていますね。ここでは Perl と同じく空文字列 "" を偽として扱っています。

一方 0 が 偽だと困ることがあります。0 が意味のある値として与えられるときです。例えば、

  • ユーザの入力
  • 外部プログラムの実行結果
  • ゼロオリジンの設定値

具体例にすれば、0 円の購入物を家計簿につける、ZnZ さんが挙げられている plumの罠、項目の表示順番を 0, 1, 2 ... とするプログラムなどが言えるかと思います。

つまり、0 が偽な言語では、値 hoge が有効かどうかを条件とする際に、

  • 0 は有効な値ではない => 変数をそのまま条件式に => if (hoge)
  • 0 は有効な値である => 変数をそのまま条件式にすると偽になってしまうので、代わりに変数の存在を確かめる必要がある => if (defined hoge)

といった使い分けを必要とするのではないでしょうか。

大変そうだけど、慣れれば自然と回避できるようになるのかな。

本日のツッコミ(全2件) [ツッコミを入れる]
_ なおゆき (2006-03-20 00:27)

> 大変そうだけど、慣れれば自然と回避できるようになるのかな。<br>2年間ほどperlを使い続けていますが、いまだに慣れません。<br>いまだに、これを理由に潜在的なバグを含んだプログラムを作っている気がします。<br>perlの神様たちはどうしているんでしょうね。

_ だて (2006-03-25 02:14)

米人が多少のデザイン崩れを気にも留めないように、重篤なバグの原因にならなければ気にしないのかもしれませんね。

[]

最近のコメント:

  1. だて (03-25)
  2. なおゆき (03-20)

RSS
Creative Commons License
This work is licensed under a Creative Commons License
(note: text only. w/o web design, citations, (re)distributed softwares).