Symbol 构造函数
- 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.memberName 在 Object.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;