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;