- OpenTofu言語
- 式
- 算術演算子と論理演算子
算術演算子と論理演算子
演算子とは、1つ以上の他の式を変換または組み合わせる式の1種です。演算子は、2つの値を組み合わせて3番目の結果値を生成するか、または1つの与えられた値を変換して1つの結果値を生成します。
2つの値で動作する演算子は、数学表記と同様に、2つの値の間に演算子記号を配置します。例:1 + 2
。1つの値だけで動作する演算子は、その値の前に演算子記号を配置します。例:!true
。
OpenTofu言語には、算術演算子と論理演算子のセットがあり、JavaScriptやRubyなどのプログラミング言語の演算子と似ています。
式の中で複数の演算子が一緒に使用される場合、それらは次の演算子の優先順位で評価されます。
!
、-
(-1
をかける)*
,/
,%
+
、-
(減算)>
,>=
,<
,<=
==
,!=
&&
||
括弧を使用して、演算子の優先順位のデフォルトを変更できます。括弧がない場合、上位レベルが最初に評価されます。そのため、OpenTofuは1 + 2 * 3
を1 + (2 * 3)
と解釈し、(1 + 2) * 3
とは解釈しません。
さまざまな演算子は、以下で説明するように、類似の動作を持ついくつかの異なるグループに分類できます。各演算子グループは、特定の型の値を期待します。OpenTofuは、値を必要な型に自動的に変換しようとしますが、自動変換が不可能な場合はエラーメッセージを生成します。
算術演算子
算術演算子はすべて数値を期待し、結果として数値を返します。
a + b
は、a
とb
を加算した結果を返します。a - b
は、a
からb
を引いた結果を返します。a * b
は、a
とb
を掛け合わせた結果を返します。a / b
は、a
をb
で割った結果を返します。a % b
は、a
をb
で割った余りを返します。この演算子は、一般的に整数で使用した場合にのみ役立ちます。-a
は、a
に-1
を掛けた結果を返します。
OpenTofuは、関数として、その他あまり一般的ではない数値演算をサポートしています。たとえば、pow
関数を使用して指数を計算できます。
等価演算子
等価演算子はどちらも、任意の型の2つの値を受け取り、結果としてブール値を返します。
a == b
は、a
とb
が両方とも同じ型で同じ値を持つ場合はtrue
を、そうでない場合はfalse
を返します。a != b
はa == b
の逆です。
等価演算子は、等価性を判断するために、両方の引数が完全に同じ型であることを要求するため、これらの演算子はプリミティブ型の値に対してのみ使用するか、明示的な型変換関数を使用して比較に使用する型を示すことをお勧めします。
構造化型の比較は、各引数の型を確実に把握していない場合、予期せぬ結果を生成する可能性があります。たとえば、var.list == []
は、var.list
が空のリストである場合にtrue
を返すように見えますが、[]
は実際にはtuple([])
型の値を構築するため、2つの値は一致することはありません。このような状況では、代わりにlength(var.list) == 0
と記述する方が明確なことが多いです。
比較演算子
比較演算子はすべて数値を期待し、結果としてブール値を返します。
a < b
は、a
がb
より小さい場合はtrue
を、そうでない場合はfalse
を返します。a <= b
は、a
がb
以下である場合はtrue
を、そうでない場合はfalse
を返します。a > b
は、a
がb
より大きい場合はtrue
を、そうでない場合はfalse
を返します。a >= b
は、a
がb
以上である場合はtrue
を、そうでない場合はfalse
を返します。
論理演算子
論理演算子はすべてブール値を期待し、結果としてブール値を返します。
a || b
は、a
またはb
のいずれかがtrue
の場合はtrue
を、両方がfalse
の場合はfalse
を返します。a && b
は、a
とb
の両方がtrue
の場合はtrue
を、いずれか一方がfalse
の場合はfalse
を返します。!a
は、a
がfalse
の場合はtrue
を、a
がtrue
の場合はfalse
を返します。
OpenTofuには、「排他的論理和」演算の演算子はありません。両方の演算子がブール値であることがわかっている場合、排他的論理和は!=
(「等しくない」)演算子と同等です。
OpenTofuの論理演算子はショートサーキットしません。つまり、var.foo || var.foo.bar
は、var.foo
がnull
の場合、var.foo
とvar.foo.bar
の両方が評価されるため、エラーメッセージを生成します。