先日ブログに書いた「javascriptの三項演算子と論理演算子の調査」を多言語に展開してみました。
[Javascript] 三項演算子より短く変数代入する方法
ひとつ前提としておきたいのは、WEBサービスを構築するプログラマーは、javascriptだけではなく、CGI言語や、サーバー管理言語などをいくつか使用しなければいけないケースが多く、それぞれの言語方言に悩まされる場面も多いと思います。
よくあるのが、javascriptとphpの変数定義を間違えて、PHPで"var"と書いたり、javascriptで"public function"と書いてしまったり、こうした言語方言を無くすことはできないのですが、できれば同じような法則(コーディングルール)で運用することで、効率が向上することは間違いありません。
色々な言語を使えて、それらの概念をできるだけ近づけるように思考してみることも、言語アルゴリズムの向上トレーニングにもなるので、そうした前向き思考で、多言語の三項演算子調査を行なってみたいと思います。
PHPにおける三項演算子と論理演算子
http://php.net/manual/ja/language.operators.logical.php
PHPの論理演算リファレンスは上記のページに掲載されているので、一読するとよく理解できますが、javascriptとは全く使い方が異なり、値を変数に入れることができるjavascriptと違う点は、PHPでは、trueかfalseしか帰らないというif分の判定処理を代入するようなニュアンスになるようです。
<?php
echo 0 || "test";
> 1
testが代入されるかと思ったら、1が表示されるということは、trueが 返っているという証拠なのですね。
PHPでは、論理演算は、if,while,switchで使うことにして、通常は三項演算子で行なった方が良さそうです。
<?php
echo $hoge ? $hoge : "test";
> test
Shellで三項演算子
aaa=1
bbb=2
[ $aaa -ge $bbb ] && ccc=1 || ccc=0
echo $ccc
> 0
上記はaaaとbbbという値を"-ge"(等しい)判定して等しければ"1"そうでなければ"0"を代入しています。
なかなか変数の使い方に癖のあるshell言語ですが、インターネットサービスを行う上で、この手のプログラムがかけるかどうかで、はるかにプログラミング対応領域が拡大するので、是非CGIと合わせてshell言語も使ってみてはいかがでしょうか?
ちなみに、shellの判定部分で、代入を0にしたら論理判定はどうなるか検証してみました。
zero=0
[ $zero ] && ccc=0 || ccc=1
echo $ccc
> 0
[ $zero_sub ] && ccc=0 || ccc=1
echo $ccc
> 1
この結果からわかることは、変数のみを判定に用いた時にshellの判定部分は、0 or 1ではなく、変数が存在するかどうかで判定されているようです。
-geや-neなどの判定をつけて厳密に処理をする場合ときちんと切り分けておかないと、javascriptやPHPの感覚でやってしまうとこれもバグになりかねないですね。
pythonで三項演算子
通常の条件判定
#coding: UTF-8
num = 1
if num == 1:
res = "OK"
else :
res = "NG"
print res
> OK
三項演算子の書き方
num = 1
res = "OK" if num == 2 else "NG"
print res
> NG
なんということでしょう、Pythonは非常に多言語とは違う書き方になっているので、いきなりやると混乱してしまいます。
覚えておかないといけないのは、下記のような公式になるという事です。
"trueの場合の返り値" if "条件文" else "falseの場合の返り値"
普通にif文を1行で書くのと変わらないし、構文が特殊だし・・・orz
Pythonは嫌いな言語ではないんですが、こうした落とし穴がたまにムカつきます。
Rubyの三項演算子
num = 1
res = num == 2 ? "ok" : "ng"
puts res
> ng
文句なしの三項演算子の形です。
さすが人気言語だけありますね。
こういうところですよ。プログラミングは!
さらに論理演算子で書いてみると・・・
num = 1
res = num == 2 || "ng"
puts res
> ng
素晴らしいですね。気持ちのいいぐらいにjavascriptと同じ感じです。
これまで少し毛嫌いしていたRubyがほんの少し好きになってしまいました。
0 件のコメント:
コメントを投稿