Dartの旅04:演算子
7472 ワード
一部の言語は演算子に翻訳され、オペレータと呼ばれるものもあり、Operatorを指します.
Dartで定義されたオペレータは、次の表にあります.C++またはKotlinのようにほとんどのオペレータを書き換えることができます.これらのオペレータはリロード可能オペレータとも呼ばれます.クラスの章で詳しく述べる.
説明
オペレータ
一元接尾辞
一元接頭辞
乗算レベル
加算レベル
けたあげ
ビットと
ビット別異動
ビット単位または
大小関係とタイプ判断
等しい
ロジックと
論理または
if null
さんげんえんざん
およびリンク
に値を付ける
オペレータを使用すると、式を作成します.
上のオペレータのリストでは、各行が次の行より優先されます.
両方のオブジェクトに同じ二元オペレータがリロードされている場合、今回のリロードではオペレータが左側のオペランドを使用するリロード方法を使用します.例えば、Vectorオブジェクト+Pointオブジェクト
算術演算子
dartでサポートされている演算子は次の表のとおりです.
Operator
Meaning
+
Add
-
Subtract
-expr
Unary minus, also known as negation (reverse the sign of the expression)
*
Multiply
/
Divide
~/
Divide, returning an integer result
%
Get the remainder of an integer division(modulo)
Example:
Dartは、接頭辞および接尾辞の自己減算演算子もサポートします.
Operator
Meaning
++var
var=var+1(式の値はvar+1)
var++
var=var+1(式値var)
--var
var=var–1(式の値はvar–1)
var--
var=var–1(式の値はvar)
Example:
ここはほとんどの言語と同じです.
式と関係演算子
次の表は、式と関係演算子の意味です.
Operator
Meaning
==
等しい以下を参照して議論する
!=
不等
>
より大きい
<
より小さい
>=
以上
<=
以下
通常、dartの xまたはyがnullの場合、両方が空の場合はtrue を返す.両方が空ではなく、
次に例を示します.
タイプテストオペレータ
Operator
Meaning
as
タイプ変換(import時にライブラリ接頭辞を指定することもできます)
is
オブジェクトが指定したタイプの場合はtrue(javaのinstanceofに相当)を返します.
is!
isの反逆
前述したように、asはjavaのタイプの強転であり、親を子に変換するために使用されます.dartにもスマート変換の概念があります(kotlinと同じ):
注意:ここでは
割り当てオペレータ
付与演算子、すなわち
複合代入演算子(例えば、
論理演算子
論理演算子は
ビット演算子
次の表は、一般的な言語と共通しています.
Operator
Meaning
&
AND
|
OR
^
XOR
~expr
Unary bitwise complement (0s become 1s; 1s become 0s)
<<
Shift left
>>
Shift right
使用例:
条件式
dartには、
これは三元演算子でjavaなどの常用言語と同じです.
一般的なデフォルト値を空にするには、
および符号
ここで
前の例は次のようになります.
また、演算子をネストして使用することもできます.
演算子の使用と連結に注意するには、実際のオブジェクトで使用する必要があります.次は反例です.
ここでの
正確には
その他のオペレータ
他の例では、過剰なオペレータが見られます.
Operator
Name
Meaning
Function application
代表が関数を呼び出す
List access
中かっこ内のインデックスで指定された集合要素を取得
Member access
式にアクセスするメンバー、たとえば
Conditional member access
ここでは、
Dartで定義されたオペレータは、次の表にあります.C++またはKotlinのようにほとんどのオペレータを書き換えることができます.これらのオペレータはリロード可能オペレータとも呼ばれます.クラスの章で詳しく述べる.
説明
オペレータ
一元接尾辞
expr++ expr-- () [] . ?.
一元接頭辞
-expr !expr ~expr ++expr --expr
乗算レベル
* / % ~/
加算レベル
+ -
けたあげ
<< >>
ビットと
&
ビット別異動
^
ビット単位または
|
大小関係とタイプ判断
>= > <= < as is is!
等しい
== !=
ロジックと
&&
論理または
||
if null
??
さんげんえんざん
expr1 ? expr2 : expr3
およびリンク
..
に値を付ける
= *= /= ~/= %= += -= <<= >>= &= ^= |= ??=
オペレータを使用すると、式を作成します.
a++
a + b
a = b
a == b
c ? a : b
a is T
上のオペレータのリストでは、各行が次の行より優先されます.
両方のオブジェクトに同じ二元オペレータがリロードされている場合、今回のリロードではオペレータが左側のオペランドを使用するリロード方法を使用します.例えば、Vectorオブジェクト+Pointオブジェクト
aVector+aPoint
の結果、Vectorオブジェクトのプラス符号リロード方法が呼び出される.算術演算子
dartでサポートされている演算子は次の表のとおりです.
Operator
Meaning
+
Add
-
Subtract
-expr
Unary minus, also known as negation (reverse the sign of the expression)
*
Multiply
/
Divide
~/
Divide, returning an integer result
%
Get the remainder of an integer division(modulo)
Example:
assert(2 + 3 == 5);
assert(2 - 3 == -1);
assert(2 * 3 == 6);
assert(5 / 2 == 2.5); // Result is a double
assert(5 ~/ 2 == 2); // Result is an int
assert(5 % 2 == 1); // Remainder
assert('5/2 = ${5 ~/ 2} r ${5 % 2}' == '5/2 = 2 r 1');
Dartは、接頭辞および接尾辞の自己減算演算子もサポートします.
Operator
Meaning
++var
var=var+1(式の値はvar+1)
var++
var=var+1(式値var)
--var
var=var–1(式の値はvar–1)
var--
var=var–1(式の値はvar)
Example:
var a, b;
a = 0;
b = ++a; // Increment a before b gets its value.
assert(a == b); // 1 == 1
a = 0;
b = a++; // Increment a AFTER b gets its value.
assert(a != b); // 1 != 0
a = 0;
b = --a; // Decrement a before b gets its value.
assert(a == b); // -1 == -1
a = 0;
b = a--; // Decrement a AFTER b gets its value.
assert(a != b); // -1 != 0
ここはほとんどの言語と同じです.
式と関係演算子
次の表は、式と関係演算子の意味です.
Operator
Meaning
==
等しい以下を参照して議論する
!=
不等
>
より大きい
<
より小さい
>=
以上
<=
以下
通常、dartの
==
オペレータは、両方の変数の内容が等しいか否かを判断するために使用される.これはほとんどの言語と同じですが、2つの変数が指すオブジェクトが1つのオブジェクトであることを正確に決定したい場合は、identical()
メソッドを使用して代替することができます.ここでは、==
の動作原理について説明する.x.==(y)
が呼び出されます.ここで==
は、まず関数名として一時的に見なされ、より詳細な参照オペレータリロード部分である.次に例を示します.
assert(2 == 2);
assert(2 != 3);
assert(3 > 2);
assert(2 < 3);
assert(3 >= 3);
assert(2 <= 3);
タイプテストオペレータ
as
,is
and is!
は、いずれも実行時のタイプテストオペレータです.Operator
Meaning
as
タイプ変換(import時にライブラリ接頭辞を指定することもできます)
is
オブジェクトが指定したタイプの場合はtrue(javaのinstanceofに相当)を返します.
is!
isの反逆
前述したように、asはjavaのタイプの強転であり、親を子に変換するために使用されます.dartにもスマート変換の概念があります(kotlinと同じ):
if (emp is Person) {
// Type check
emp.firstName = 'Bob';
}
is
を用いて判断した後、emp
は、if
文の中でPersonオブジェクトとして暗黙的に認識される.これはKotlinではインテリジェント変換と呼ばれ、dartドキュメントには関連する名前はありません.as
でコードを短くすることができます.(emp as Person).firstName = 'Bob';
注意:ここでは
is
を用いて判断することを推奨します.as
の本質はタイプ強転であり、強転失敗はタイプ変換異常を生じるからです.is
は何もしない.割り当てオペレータ
付与演算子、すなわち
=
の使用法は、他の言語とほぼ一致する.変数がnullの場合にのみ割り当てを受け入れる場合は、??=
を使用します.// Assign value to a
a = value;
// b null, value, b
b ??= value;
複合代入演算子(例えば、
+=
、<<=
)は、既存の演算子と代入演算子との結合である.ここでは、複合付与演算子のリロードについては、参照演算子のリロード部分については後述しない.論理演算子
論理演算子は
!
,||
,&&
とjava,phpまたはc言語と同じです.ビット演算子
次の表は、一般的な言語と共通しています.
Operator
Meaning
&
AND
|
OR
^
XOR
~expr
Unary bitwise complement (0s become 1s; 1s become 0s)
<<
Shift left
>>
Shift right
使用例:
final value = 0x22;
final bitmask = 0x0f;
assert((value & bitmask) == 0x02); // AND
assert((value & ~bitmask) == 0x20); // AND NOT
assert((value | bitmask) == 0x2f); // OR
assert((value ^ bitmask) == 0x2d); // XOR
assert((value << 4) == 0x220); // Shift left
assert((value >> 4) == 0x02); // Shift right
条件式
dartには、
if-else
文に代わる2つのオペレータがあります.condition ? expr1 : expr2
これは三元演算子でjavaなどの常用言語と同じです.
expr1 ?? expr2
expr1
が空でない場合、式の値はexpr1
である、そうでない場合はexpr2
である.三元演算子は文ではなく式に属するため、変数または定数宣言で使用できます.var visibility = isPublic ? 'public' : 'private';
一般的なデフォルト値を空にするには、
??
オペレータを使用します.String playerName(String name) => name ?? 'Guest';
および符号
..
およびシンボルの出現はコンストラクタモードの概念を優雅にした.1つのクラスには複数のプロパティを設定できます.一時変数を宣言し、この一時変数を連続的に使用してset操作を行う必要があります.結合記号は、この一時変数を省いて、コードをコンストラクタモードのように見せることができます.querySelector('#confirm') // Get an object.
..text = 'Confirm' // Use its members.
..classes.add('important')
..onClick.listen((e) => window.alert('Confirmed!'));
ここで
querySelector()
はセレクタオブジェクトを作成し、後続のおよび連係呼び出しはすべての呼び出しの戻り値を無視する.この一連の呼び出しの最終的な戻り値は、常に設定されているオブジェクトです.前の例は次のようになります.
var button = querySelector('#confirm');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e) => window.alert('Confirmed!'));
また、演算子をネストして使用することもできます.
final addressBook = (AddressBookBuilder()
..name = 'jenny'
..email = '[email protected]'
..phone = (PhoneNumberBuilder()
..number = '415-555-0100'
..label = 'home')
.build())
.build();
演算子の使用と連結に注意するには、実際のオブジェクトで使用する必要があります.次は反例です.
var sb = StringBuffer();
sb.write('foo')
..write('bar'); // Error: method 'write' isn't defined for 'void'.
ここでの
sb.write()
の方法は、void
のタイプの方法である.彼は本当の相手に戻らなかった.そのため、この上で使用したり接続したりすることはできません.正確には
..
演算子は演算子ではなく、Dart構文の一部にすぎません.その他のオペレータ
他の例では、過剰なオペレータが見られます.
Operator
Name
Meaning
()
Function application
代表が関数を呼び出す
[]
List access
中かっこ内のインデックスで指定された集合要素を取得
.
Member access
式にアクセスするメンバー、たとえば
foo.bar
は、式foo
にアクセスするメンバーbar
です.?.
Conditional member access
.
と同様ですが、このオペレータの多くは左の値が空の可能性のある値であるために使用されます.例えば、foo?.bar
このとき式foo
の戻り値がnull
である場合、この式は全体的にnull
の値であり、そうでなければbar
の値である.ここでは、
foo?.bar??defaultValue
の形式を使用してコードを連続的に簡略化することができます.