Edited at

[lua] 三項演算子なんて飾りです!

More than 5 years have passed since last update.

lua言語には三項演算子がないらしく、代わりに以下の様な書き方をするそうです。

A and B or C

Java育ちの自分は最初「ん?andって&&と一緒だよね、なんでこれが三項演算子の代わりになるんだ?」と思いましたが、どうやらandとorって以下の仕様らしいですね。

 A and B : A が false か nil ならAを返し、そうでなければBを返す。

 A or B  : A が false か nil 以外ならAを返し、そうでなければBを返す。

よってこうなるわけですね。

 A and B or C

 
 ・Aがtrueの場合(B、Cは値)
  「true and B or C」→「B or C」→「B」
 ・Aがfalseの場合(B、Cは値)
  「false and B or C」→「false or C」→「C」

ははぁ、なるほど。納得です。しかし、コレ以上andやorを連結していくと正規表現以上にワケわからなくなりそうですね。三項演算子に使えるよ程度にしておいたほうが良さそうです(^^;

ちょっと注意事項も追記。Bがnilになる可能性のある変数や関数の場合はCまで評価されてしまうので注意ですね。

 A and B or C

 
 ・Aがtrueの場合(Bがnilの場合)
  「true and B or C」→「B(nil) or C」→「C」
 ・Aがtrueの場合(Bがvoid型/nil, falseを返す関数の場合)
  「true and B() or C()」→「B() or C()」→(Bを評価で返り値がnil)→「C」

参考:

Lua5.1.3 SJIS版の更新と三項演算子など

http://hammm.blog21.fc2.com/blog-entry-74.html

2項演算子を使った3項演算子風実装

http://d.hatena.ne.jp/tattyu/20070821