Symbol 构造函数

const Symbol(
  1. String name
)

构建一个新 Symbol,该符号表示提供的名称。

从相等 name 字符串创建的符号自身相等。如果使用 const 创建符号,则具有相同 name 字符串的符号将被规范化并相同。

某些 name 字符串创建的符号也可以使用符号文字创建,或者在运行 Dart 程序时隐式创建,例如通过 Object.noSuchMethod

如果 name 是一个不带下划线开头的单个 Dart 标识符,或者它是一个限定的标识符(多个标识符通过 . 分隔),或者它是不同于 unary-("+", "-", "*", "/", "%", "~/", "&", "|", "^", "~", "<<", ">>", ">>>", "<", "<=", "", ">=", "==", "[]" 或 "[]=" 之一)的用户定义运算符的名称,那么 Symbol(name) 的结果等于通过将 # 前缀添加到 name 的内容创建的符号文字,而 const Symbol(name) 与该符号文字相同。也就是说,#foo == Symbol("foo")identical(#foo, const Symbol("foo"))

如果 name 是一个不以下划线开头的单个标识符,后跟一个 =,则该符号是一个设置器名称,并且可以等于 Invocation.memberNameObject.noSuchMethod 调用中。

无法使用符号构造函数创建私有符号文字,例如 #_foo。符号 const Symbol("_foo") 不等于任何符号文字,也不等于由 noSuchMethod 引入的任何源名称符号。

assert(Symbol("foo") == Symbol("foo"));
assert(Symbol("foo") == #foo);
assert(identical(const Symbol("foo"), const Symbol("foo")));
assert(identical(const Symbol("foo"), #foo));
assert(Symbol("[]=") == #[]=]);
assert(identical(const Symbol("[]="), #[]=));
assert(Symbol("foo.bar") == #foo.bar);
assert(identical(const Symbol("foo.bar"), #foo.bar));

创建的实例重写了 Object.==

实现

const factory Symbol(String name) = internal.Symbol;