0

打印飞镖对象的地址有什么技巧吗?我遇到了一个问题,我有一个标准枚举类,如Dart 支持枚举吗?.

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

如果我提供一个operator==(Access other)来比较它返回预期值的值。所以,我想这可能与来自不同库的课程(可能与隔离相关)有关,如果我可以打印accessAccess.RO的地址,我可以看看它们是否不同。当然,如果它们不同,我也需要知道为什么。

4

2 回答 2

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
}

这可以解释你的问题。

于 2013-04-05T14:56:00.487 回答
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 不允许传输任意对象。

于 2013-04-05T18:30:50.510 回答