Help us understand the problem. What is going on with this article?

[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

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away