dart - 为什么相同()在两个字符串上返回true
问题描述
我是飞镖的新手。文档说:“要测试两个对象 x 和 y 是否代表相同的事物,请使用 == 运算符。(在极少数情况下,您需要知道两个对象是否完全相同,请改用 same() 函数.)”
因此,如果输入以下代码:
var foo = 'bar';
var baz = 'bar';
print(identical(foo, baz));
如果我很好理解, foo 和 bar 不会引用同一个对象。所以 same() 必须返回 false,不是吗?但事实并非如此,至少在 DartPad 中是这样。
问题出在哪里。
解决方案
在这种情况下foo
,bar
请引用同一个对象。那是因为编译器规范化了字符串文字。
该规范要求对大多数常量进行规范化。如果const Duration(seconds: 1)
在两个地方创建,它将成为同一个对象。整数、双精度和布尔值总是规范化的,无论是否为常量(该语言假装每个值只有一个实例)。
字符串的特殊之处在于规范对它们是否需要规范化并不完全清楚,但常量字符串需要规范化才能使常量有意义,所有编译器都这样做。文字是一个常量表达式,因此字符串文字总是被规范化的。这意味着'bar'
无论它出现在代码中的什么位置,它都表示同一个对象。
推荐阅读
- list - 扫雷板标签(初级)
- neo4j - 使用 py2neo 进行 Neo4j 可视化:TypeError: 'LabelSetView' object is not callable
- excel - VBA - 尝试从组合框中删除项目时出现错误 381
- unit-testing - KotlinTest 基于属性的测试和生成器
- python - Google Colab 不显示图片
- jupyter-notebook - 即使在创建 .zshrc 文件并从 bash 配置文件复制 anaconda 安装程序代码后也找不到 jupyter
- android - 如何将额外内容传递给动态快捷方式?
- python - 如何在 PyQT5 的每个循环中显示新的 QMainWindow?
- reactjs - 使用 jest 进行测试时反应钩子未设置状态
- ray - 在光线设置期间激活 Conda 环境