【追記】したたか企画さんからのリプライを追記しました。ありがとうございます。
やりたいこと
字形パネルをショートカットで閉じたり開いたりしたいのですが、デュアルモニターだとメインでないデスクトップにある字形パネルがうまく開閉できないのです。そこでスクリプトで開閉させてやろうと思いました。
要するにPanel.visible
をトグルさせたいわけです。
正攻法のif文
if (app.panels.itemByName("字形").visible){ app.panels.itemByName("字形").visible = false; } else app.panels.itemByName("字形").visible = true;
なのですが、ご覧の通り、ちょっと(いやかなり)ダサい。
三項演算子
今度は三項演算子を使って書き直します。
var jikei = app.panels.itemByName("字形"); (jikei.visible)? jikei.visible=false: jikei.visible=true;
多少はマシになりました?
それでも変数を使わないとかなり冗長になります。
それに何度も同じものを書くというのは「僕の美学に反します」。
XOR演算子
これをXOR演算子^
を使って書いてみます。
app.panels.itemByName("字形").visible ^= 1;
超すっきりですね。
このやり方は少し前に@AJABON先生に教わりました。
XOR演算子とは
XOR演算子を含めたビット演算子について、詳細は以下を参照。
ここからXOR演算子についての説明を抜粋すると、
a
XORb
は、a
とb
が異なる場合に 1 を出力します
ということで、先程のコードではPanel.visible
と1
を比較し、前者がtrue
なら式は1 ^ 1
の評価となり0
が返ります。逆に前者がfalse
なら0 ^ 1
となり、1
が返るわけです*1。
ビット演算子利用時の注意点
ビット演算子を利用する場合は、最大32ビットになるので-2147483648〜2147483647までの数値しか比較できません*2。
オペランドは 32 ビット整数に変換され、ビット列(0 と 1)として表現されます。32 ビットを超える数値は、最上位のビットが破棄されます。例えば以下の 32 ビットを超える数値は、32 ビット整数値に変換されます
変換前: 11100110111110100000000000000110000000000001 変換後: 10100000000000000110000000000001
ということのようです。
以上、XOR演算子を使った真偽値のトグルでした。
否定演算子
したたか企画先生からリプライをいただきました。
個人的には一目で何やってるかわからないのがいやなのでこのように書きます。
— したたか企画 (@sttk3com) 2017年11月15日
var jikei = app.panels.itemByName("字形");
jikei.visible = !jikei.visible;