是否有任何技巧可以打印飞镖对象的地址? 我遇到了一个问题,我有Does Dart support enumerations?中描述的标准枚举类。
class Access {
static const IA = const Access._(0);
static const RO = const Access._(1);
static const RW = const Access._(2);
final int value;
const Access._(this.value);
...
}
变量 access 的类型为Access,值为1,但 access == Access.RO 返回false。
var access = _.access;
print('''
access => ($access, ${access.runtimeType}, ${access.value})
static => (${Access.RO}, ${Access.RO.runtimeType}, ${Access.RO.value})
equal ? => ${(access == Access.RO)}
''');
打印
access => (RO, Access, 1)
static => (RO, Access, 1)
equal ? => false
如果我提供比较值的运算符==(访问其他),则返回预期值。所以,我想也许这可能与来自不同库的类(可能是隔离相关)有关,如果我可以打印访问和 Access.RO 的地址我可以看出它们是不同的。当然,如果它们不同,那么我也需要知道原因。
答案 0 :(得分:2)
当你处理 const 时,你必须非常小心。如果您使用new Access._(0)
而不是const Access._(0)
,则不会获得相同的对象。这是一个例子:
class Access {
static const IA = const Access._(0);
static const RO = const Access._(1);
static const RW = const Access._(2);
final int value;
const Access._(this.value);
}
main(){
print(Access.IA == const Access._(0)); // prints true
print(Access.IA == new Access._(0)); // prints false
}
这可以解释你的问题。
答案 1 :(得分:1)
如果identical(a, b)
返回false,则可以确定它们的指针不同。 (对于数字,反之不一定正确,但这是一个实现细节。)
如果您正在处理隔离物,则在传输物体时需要小心。即使如果它们在一方面被规范化,它们也不会在被传递给另一个孤立者之后:
import 'dart:async';
import 'dart:isolate';
class A { const A(); }
foo() {
port.receive((x, _) {
print(x == const A()); // Prints false.
});
}
main() {
var p = new ReceivePort(); // To keep the program running.
spawnFunction(foo).send(const A(), null);
}
另请注意,dart2js不允许传输任意对象。