Dart - Symbol(符号)

Dart - Symbol(符号) 首页 / Dart入门教程 / Dart - Symbol(符号)

Symbol是一种用于存储人类可读字符串和经过优化以供计算机使用的字符串之间的关系的方法。

Symbol obj=new Symbol('name');  

name必须是有效的公共Dart成员名称,公共构造函数名称或库名称。

考虑以下示例,该代码在库 foo_lib 中声明了一个 Foo 类,该类定义方法 m1,m2,和 m3 。

链接:https://www.learnfk.comhttps://www.learnfk.com/dart-programming/dart-programming-symbol.html

来源:LearnFk无涯教程网

library foo_lib;   
//库名可以是一个符号

class Foo {         
   //类名可以是一个符号
   m1() {        
      //方法名称可以是一个符号
      print("Inside m1"); 
   } 
   m2() { 
      print("Inside m2"); 
   } 
   m3() { 
      print("Inside m3"); 
   } 
}

以下代码在Symbol类型的帮助下加载Foo.dart库并搜索Foo类, 由于我们反映了上述库中的元数据,因此代码将导入dart:mirrors库。

import 'dart:core'; 
import 'dart:mirrors'; 
import 'Foo.dart';  

main() { 
   Symbol lib=new Symbol("foo_lib");   
   //库名称存储为符号
   
   Symbol clsToSearch=new Symbol("Foo");  
   //类名存储为 Symbol
   
   if(checkIf_classAvailableInlibrary(lib, clsToSearch))  
   //在 foo_lib 库中搜索 Foo 类
      print("class found.."); 
}  
   
bool checkIf_classAvailableInlibrary(Symbol libraryName, Symbol className) { 
   MirrorSystem mirrorSystem=currentMirrorSystem(); 
   LibraryMirror libMirror=mirrorSystem.findLibrary(libraryName); 
      
   if (libMirror != null) { 
      print("Found Library"); 
      print("checkng...class details.."); 
      print("No of classes found is : ${libMirror.declarations.length}"); 
      libMirror.declarations.forEach((s, d) => print(s));  
         
      if (libMirror.declarations.containsKey(className)) return true; 
      return false; 
   } 
}

注意,行libMirror.declarations.forEach((s,d)=> print(s)); 将在运行时遍历库中的每个声明,并将声明打印为Symbol类型。

此代码应产生以下输出-

无涯教程网

Found Library 
checkng...class details.. 
No of classes found is : 1 
Symbol("Foo") //类名显示为符号类型
class found. 

现在让我们考虑显示一个类中方法的数量。预定义的类 ClassMirror 可帮助我们实现相同的目的。

import 'dart:core'; 
import 'dart:mirrors'; 
import 'Foo.dart';  

main() { 
   Symbol lib=new Symbol("foo_lib"); 
   Symbol clsToSearch=new Symbol("Foo");  
   reflect_InstanceMethods(lib, clsToSearch); 
}  
void reflect_InstanceMethods(Symbol libraryName, Symbol className) { 
   MirrorSystem mirrorSystem=currentMirrorSystem(); 
   LibraryMirror libMirror=mirrorSystem.findLibrary(libraryName); 
   
   if (libMirror != null) { 
      print("Found Library"); 
      print("checkng...class details.."); 
      print("No of classes found is : ${libMirror.declarations.length}"); 
      libMirror.declarations.forEach((s, d) => print(s));  
      
      if (libMirror.declarations.containsKey(className)) print("found class");
      ClassMirror classMirror=libMirror.declarations[className]; 
      
      print("No of instance methods found is ${classMirror.instanceMembers.length}");
      classMirror.instanceMembers.forEach((s, v) => print(s)); 
   } 
}    

此代码应产生以下输出-

无涯教程网

Found Library 
checkng...class details.. 
No of classes found is : 1 
Symbol("Foo") 
found class 
No of instance methods found is 8 
Symbol("==") 
Symbol("hashCode") 
Symbol("toString") 
Symbol("noSuchMethod") 
Symbol("runtimeType") 
Symbol("m1") 
Symbol("m2") 
Symbol("m3")

您可以使用 MirrorSystem 类将存储在Symbol中的类或库之类的类型名称转换回字符串,以下代码显示了如何将Symbol转换为字符串。

import 'dart:mirrors'; 
void main(){ 
   Symbol lib=new Symbol("foo_lib"); 
   String name_of_lib=MirrorSystem.getName(lib); 
   
   print(lib); 
   print(name_of_lib); 
}

它应该产生以下输出-

Symbol("foo_lib")   

foo_lib     

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

左耳听风 -〔陈皓〕

Java核心技术面试精讲 -〔杨晓峰〕

性能工程高手课 -〔庄振运〕

Service Mesh实战 -〔马若飞〕

人人都用得上的写作课 -〔涵柏〕

小马哥讲Spring AOP编程思想 -〔小马哥〕

HarmonyOS快速入门与实战 -〔QCon+案例研习社〕

超级访谈:对话张雪峰 -〔张雪峰〕

超级访谈:对话道哥 -〔吴翰清(道哥)〕

好记忆不如烂笔头。留下您的足迹吧 :)