Flutter 1-10】Flutter手把手教程Dart語言——運算符

做者 | 弗拉德
來源 | 弗拉德(公衆號:fulade_me)ide

運算符

運算符是一種告訴編譯器執行特定的數學或邏輯操做的符號。Dart語言內置了豐富的運算符,並提供瞭如下類型的運算符:算術運算符、關係運算符、類型判斷運算符、賦值運算符、邏輯運算符、按位和移位運算符、條件表達式、級聯運算符以及其餘運算符函數

算數運算符

算數運算符 描述
+
-
- 表達式 一元負, 也能夠做爲反轉(反轉表達式的符號)
*
/
~/ 除並取整
% 取模

示例:ui

assert(2 + 3 == 5);
assert(2 - 3 == -1);
assert(2 * 3 == 6);
assert(5 / 2 == 2.5); // 結果是一個浮點數
assert(5 ~/ 2 == 2); // 結果是一個整數
assert(5 % 2 == 1); // 取餘

assert('5/2 = ${5 ~/ 2} r ${5 % 2}' == '5/2 = 2 r 1');

Dart 還支持自增自減運算符:code

自增自減運算符 描述
++ var var = var + 1 (表達式的值爲 var + 1)
var ++ var = var + 1 (表達式的值爲 var)
-- var var = var – 1 (表達式的值爲 var – 1)
var -- var = var – 1 (表達式的值爲 var)

示例:對象

var a, b;

a = 0;
b = ++a; // 在 b 賦值前將 a 增長 1。
assert(a == b); // 1 == 1

a = 0;
b = a++; // 在 b 賦值後將 a 增長 1。
assert(a != b); // 1 != 0

a = 0;
b = --a; // 在 b 賦值前將 a 減小 1。
assert(a == b); // -1 == -1

a = 0;
b = a--; // 在 b 賦值後將 a 減小 1。
assert(a != b); // -1 != 0

關係運算符

關係運算符 描述
== 相等
!= 不等於
> 大於
< 小於
>= 大於等於
<= 小於等於

要判斷兩個對象 x 和 y 是否表示相同的事物使用 == 便可。(在極少數狀況下,可能須要使用 identical() 函數來肯定兩個對象是否徹底相同)。
下面是 == 運算符的一些規則:教程

  1. 假設有變量 xy,且 xy 至少有一個爲 null,則當且僅當 xy 均爲 nullx == y 纔會返回 true,不然只有一個爲 null 則返回 false接口

  2. x.==(y) 將會返回值,這裏無論有沒有y,即 y 是可選的。也就是說 == 實際上是 x 中的一個方法,而且能夠被重寫。

下面的代碼給出了每一種關係運算符的示例:ip

assert(2 == 2);
assert(2 != 3);
assert(3 > 2);
assert(2 < 3);
assert(3 >= 3);
assert(2 <= 3);

類型判斷運算符

asisis! 運算符是在運行時判斷對象類型的運算符。
類型判斷運算符 描述
as 類型轉換(也用做指定類前綴))
is 若是對象是指定類型則返回 true
is! 若是對象是指定類型則返回 false

當且僅當 obj對象 實現了 T 的接口,obj對象 is T 纔是 true。例如 obj對象 is Object 總爲 true,由於全部類都是 Object 的子類。編譯器

僅當你肯定這個對象是該類型的時候,你纔可使用 as 操做符能夠把對象轉換爲特定的類型。例如:數學

(emp as Person).firstName = 'Bob';

若是你不肯定這個對象類型是否是 T,請在轉型前使用 is T 檢查類型。

if (emp is Person) {
  // 類型檢查
  emp.firstName = 'Bob';
}

你可使用 as 運算符進行縮寫:

(emp as Person).firstName = 'Bob';

賦值運算符

可使用 = 來賦值,同時也可使用 ??= 來爲值爲 null 的變量賦值。

// 將 value 賦值給 a (Assign value to a)
a = value;
// 當且僅當 b 爲 null 時才賦值
b ??= value;
+= 這樣的賦值運算符將算數運算符和賦值運算符組合在了一塊兒。
= –= /= %= >>= ^=
+= *= ~/= <<= &= =

下面的例子展現瞭如何使用賦值以及複合賦值運算符:

a += b      //就 等同於 a = a + b
var a = 2; // 使用 = 賦值 (Assign using =)
a *= 3; // 賦值並作乘法運算 Assign and multiply: a = a * 3
assert(a == 6);

邏輯運算符

類型判斷運算符 描述
!表達式 對錶達式結果取反(即將 true 變爲 false,false 變爲 true)
|| 邏輯或
&& 邏輯與

下面是使用邏輯表達式的示例:

if (!done && (col == 0 || col == 3)) {
  // ...Do something...
}

按位和移位運算符

按位和移位運算符 描述
& 按位與
| 按位或
^ 按位異或
~ 表達式 按位取反(即將 「0」 變爲 「1」,「1」 變爲 「0」)
<< 位左移
>> 位右移

下面是使用按位和移位運算符的示例:

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)

條件表達式

條件 ? 表達式 1 : 表達式 2 :若是條件爲 true,執行表達式 1並返回執行結果,不然執行表達式 2 並返回執行結果。
表達式 1 ?? 表達式 2:若是表達式 1 爲非 null 則返回其值,不然執行表達式 2 並返回其值。
若是賦值是根據布爾表達式則考慮使用 ?:

var visibility = isPublic ? 'public' : 'private';

若是賦值是根據斷定是否爲 null 則考慮使用 ??

String playerName(String name) => name ?? 'Guest';

上述示例還能夠寫成至少下面兩種不一樣的形式,只是不夠簡潔:

// 相對使用 ?: 運算符來講稍微長了點。(Slightly longer version uses ?: operator).
String playerName(String name) => name != null ? name : 'Guest';

// 若是使用 if-else 則更長。
String playerName(String name) {
  if (name != null) {
    return name;
  } else {
    return 'Guest';
  }
}

級聯運算符

級聯運算符(..)可讓你在同一個對象上連續調用多個對象的變量或方法。
好比下面的代碼:

querySelector('#confirm') // 獲取對象 (Get an object).
  ..text = 'Confirm' // 使用對象的成員 (Use its members).
  ..classes.add('important')
  ..onClick.listen((e) => window.alert('Confirmed!'));

第一個方法 querySelector 返回了一個 Selector 對象,後面的級聯操做符都是調用這個 Selector 對象的成員並忽略每一個操做的返回值。

上面的代碼至關於:

var button = querySelector('#confirm');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e) => window.alert('Confirmed!'));

級聯運算符能夠嵌套,例如:

final addressBook = (AddressBookBuilder()
      ..name = 'jenny'
      ..email = 'jenny@example.com'
      ..phone = (PhoneNumberBuilder()
            ..number = '415-555-0100'
            ..label = 'home')
          .build())
    .build();

在返回對象的函數中謹慎使用級聯操做符。例如,下面的代碼是錯誤的:

var sb = StringBuffer();
sb.write('foo')
  ..write('bar'); // 出錯:void 對象中沒有方法 write (Error: method 'write' isn't defined for 'void').

上述代碼中的 sb.write() 方法返回的是 void,返回值爲 void 的方法則不能使用級聯運算符。

其餘運算符

大多數其它的運算符,已經在其它的示例中使用過:
運算符 名字 描述
() 使用方法 表明調用一個方法
[] 訪問 List 訪問 List 中特定位置的元素
. 訪問成員 成員訪問符
?. 條件訪問成員 與上述成員訪問符相似,可是左邊的操做對象不能爲 null,例如 foo?.bar,若是 foo 爲 null 則返回 null ,不然返回 bar

更多關於 ., ?... 運算符介紹,會在下一章Flutter手把手教程Dart語言——類中講解.

公衆號

相關文章
相關標籤/搜索