我注意到了以前从未见过的运算符^。它被用于计算哈希码,详情见下文。下面是一个代码片段,检查hashcode部分,我看到:
import './color.dart';
import './colors.dart';
class CoreState {
final int counter;
final Color backgroundColor;
const CoreState({
this.counter = 0,
this.backgroundColor = Colors.white,
});
CoreState copyWith({
int? counter,
Color? backgroundColor,
}) =>
CoreState(
counter: counter ?? this.counter,
backgroundColor: backgroundColor ?? this.backgroundColor,
);
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is CoreState &&
runtimeType == other.runtimeType &&
counter == other.counter &&
backgroundColor == other.backgroundColor;
@override
int get hashCode => counter.hashCode ^ backgroundColor.hashCode;
@override
String toString() {
return "counter: $countern"
"color:$backgroundColor";
}
}
Dart Language Tour解释了^
是bitwise XOR
。这个运算符通常用于计算哈希码。为什么在Java hascode中经常使用异或?
^运算符在Dart中表示异或。
详细信息请查看
在Dart中,^
操作符是一个用户可定义的操作符。
它的传统用法是整数和布尔值的异或(XOR)。
var x = 170;
x = x ^ 85;
print(x); // 255;
x ^= 85; // Same meaning as `x = x ^ 85;`.
print(x); // 170
和
var oddity = false;
for (var number in someNumbers) {
oddity ^= element.isOdd;
}
// True if an odd number of numbers are odd.
您也可以在自己的类上实现^
操作符。例如,BigInt
和Int32x4
类具有类似的基于xor的含义。
你也可以用它来做其他事情,比如矩阵求幂:
class Matrix {
// ...
Matrix operator ^(int power) {
RangeError.checkNotNegative(power, "power");
if (this.height != this.width) {
throw UnsupportedError("Can only do exponents of square matrices");
}
var result = Matrix.identity(this.height);
while (power > 0) { // Can be made more efficient!
result *= this;
power -= 1;
}
return result;
}
}
...
var matrix = otherMatrix ^ 2;
操作符的优先级始终相同(仅在&
和|
之间)。