Dart有兩個運算符,有時可以替換 if-else 表達式, 讓表達式更簡潔:
condition ? expr1 : expr2
expr1 ?? expr2
如果賦值是根據布爾值, 考慮使用 ?:。
var visibility = isPublic ? 'public' : 'private';
如果賦值是基于判定是否為 null, 考慮使用 ??。
String playerName(String name) => name ?? 'Guest';
下面給出了其他兩種實現(xiàn)方式, 但并不簡潔:
// Slightly longer version uses ?: operator.
String playerName(String name) => name != null ? name : 'Guest';
// Very long version uses if-else statement.
String playerName(String name) {
if (name != null) {
return name;
} else {
return 'Guest';
}
}
級聯(lián)運算符 (..) 可以實現(xiàn)對同一個對像進行一系列的操作。 除了調用函數, 還可以訪問同一對象上的字段屬性。 這通常可以節(jié)省創(chuàng)建臨時變量的步驟, 同時編寫出更流暢的代碼。
考慮一下代碼:
querySelector('#confirm') // 獲取對象。
..text = 'Confirm' // 調用成員變量。
..classes.add('important')
..onClick.listen((e) => window.alert('Confirmed!'));
第一句調用函數 querySelector() , 返回獲取到的對象。 獲取的對象依次執(zhí)行級聯(lián)運算符后面的代碼, 代碼執(zhí)行后的返回值會被忽略。
上面的代碼等價于:
var button = querySelector('#confirm');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e) => window.alert('Confirmed!'));
級聯(lián)運算符可以嵌套,例如:
final addressBook = (AddressBookBuilder()
..name = 'jenny'
..email = 'jenny@example.com'
..phone = (PhoneNumberBuilder()
..number = '415-555-0100'
..label = 'home')
.build())
.build();
在返回對象的函數中謹慎使用級聯(lián)操作符。 例如,下面的代碼是錯誤的:
var sb = StringBuffer();
sb.write('foo')
..write('bar'); // Error: 'void' 沒喲定義 'write' 函數。
sb.write() 函數調用返回 void, 不能在 void 對象上創(chuàng)建級聯(lián)操作。
提示: 嚴格的來講, “兩個點” 的級聯(lián)語法不是一個運算符。 它只是一個 Dart 的特殊語法。
大多數剩余的運算符,已在示例中使用過:
Operator | Name | Meaning |
---|---|---|
() | Function application | Represents a function call |
[] | List access | Refers to the value at the specified index in the list |
. | Member access | Refers to a property of an expression; example: foo.bar selects property bar from expression foo |
?. | Conditional member access | Like . , but the leftmost operand can be null; example: foo?.bar selects property bar from expression foo unless foo is null (in which case the value of foo?.bar is null) |
更多關于 ., ?. 和 .. 運算符介紹,參考 Classes.
更多建議: