为什么same()在两个字符串上返回true

时间:2019-05-27 20:16:51

标签: dart

我是Dart的新手。该文档说:“要测试两个对象x和y是否表示同一对象,请使用==运算符。(在极少数情况下,您需要知道两个对象是否完全相同,请使用same()函数代替。”

因此,如果输入以下代码:

var foo = 'bar';
var baz = 'bar';
print(identical(foo, baz));

如果我很了解,foo和bar不会引用同一对象。所以same()必须返回false,不是吗? 至少在DartPad中不是这样。

问题出在哪里。

3 个答案:

答案 0 :(得分:3)

在这种情况下,foobar确实引用了同一对象。 这是因为编译器 canonicalize 字符串文字。

该规范要求将大多数常量规范化。如果在两个地方创建const Duration(seconds: 1),它将成为 same 对象。整数,双精度和布尔值总是规范化的,无论是否恒定(该语言假装每个值只有一个实例)。

字符串的特殊之处在于,对于是否需要规范化规范尚不完全清楚,但是为了使常量有意义,需要对 constant 字符串 进行规范化,所有编译器都这样做。 文字是一个常量表达式,因此字符串文字总是规范化的。这意味着'bar'表示相同的对象,无论它出现在代码中的什么位置。

答案 1 :(得分:1)

对于多个内置的“文字”,对于相等的值,您将始终获得相同的true

  • 布尔
  • 字符串
  • int
  • 双(我认为)

答案 2 :(得分:0)

Kevin Moore所述,某些文字是隐式常量。如果用相同的属性初始化常量,则它们的值是相同的。

检查一下:

void main() {
  // Without constant constructor
  var houseA = House(100, 100);
  var houseB = House(100, 100);

  print(identical(houseA, houseB)); // Output: false

  // With constant constructor
  houseA = const House(100, 100);
  houseB = const House(100, 100);

  print(identical(houseA, houseB)); // Output: true
}

class House {
  final int width;
  final int height;

  const House(this.width, this.height);
}