Dartの旅04:演算子

7472 ワード

一部の言語は演算子に翻訳され、オペレータと呼ばれるものもあり、Operatorを指します.
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がnullの場合、両方が空の場合はtrue
  • を返す.
  • 両方が空ではなく、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の形式を使用してコードを連続的に簡略化することができます.