打印对象的地址

时间:2013-04-05 14:34:16

标签: dart

是否有任何技巧可以打印飞镖对象的地址? 我遇到了一个问题,我有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 的地址我可以看出它们是不同的。当然,如果它们不同,那么我也需要知道原因。

2 个答案:

答案 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不允许传输任意对象。