首页 > 其他分享 >无涯教程-Dart - Symbol(符号)

无涯教程-Dart - Symbol(符号)

时间:2023-11-12 20:32:08浏览次数:31  
标签:Foo lib Symbol 无涯 Dart print dart libMirror

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

Symbol obj=new Symbol('name');  

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

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

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     

参考链接

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

标签:Foo,lib,Symbol,无涯,Dart,print,dart,libMirror
From: https://blog.51cto.com/u_14033984/8330791

相关文章

  • 无涯教程-Dart - Map(映射)
    Map对象是一个简单的键/值对,Map中的键和值可以是任何类型,Map是动态集合,换句话说,Map可以在运行时增长和收缩。您需要将键/值对(key/value)放在大括号"{}"中,这是它的语法-varidentifier={key1:value1,key2:value2[,…..,key_n:value_n]}构造函数声明Map的语法如下-var......
  • 无涯教程-Dart - Lists(列表)
    array是编程中非常常用的集合,Dart以List对象的形式表示数组,列表只是一组有序的象。dart:core库提供了List类,该类允许创建和操作列表。Dart中列表的逻辑表示如下-固定长度列表固定长度列表的长度不能在运行时更改,创建固定长度列表的语法如下:步骤1  - 声明列表下......
  • 无涯教程-Dart - Boolean(布尔)
    Dart为Boolean数据类型提供了内置支持,DART中的布尔数据类型仅支持两个值–true和false。语法如下所示-boolvar_name=true;ORboolvar_name=falseBoolean-示例1voidmain(){booltest;test=12>5;print(test);}它将产生以下输出-trueBoolea......
  • 无涯教程-Dart - Numbers(数值)
    Dartnumber可以归类为-int    -  任意大小的整数。double -  64位(双精度)浮点数,由IEEE754标准指定,double数据类型用于表示小数语法-intvar_name;//声明一个整型变量doublevar_name;//声明一个双精度变量voidmain(){intnum......
  • 无涯教程-Dart - 条件判断
    条件语句在执行指令之前先判断条件。下表中对Dart中的条件构造进行了分类。Sr.NoStatement&描述1ifstatementif语句包含一个布尔表达式,后跟一个或多个语句。2If...ElseStatement一个if后面可以是一个可选的else块。如果if块测试的布尔表达式判断为false,......
  • 无涯教程-Dart - 循环语句
    下图说明了条件循环的分类-Sr.NoLoop&Remark1forloopfor循环是确定循环的实现,for循环将代码块执行指定的次数,它可以用于迭代一组固定值,如数组2for…inLoopfor...in循环用于循环访问对象的属性。继续,让我们现在讨论无限循环,当循环中的迭代次数不确定或未知时,......
  • 无涯教程-Dart - 运算符
    在本章中,我们将讨论Dart中可用的运算符。算术运算符关系运算符类型运算符按位运算符赋值运算符逻辑运算符算术运算符下表显示了Dart支持的算术运算符。Sr.NoOperators&Meaning1+相加2-相减3-expr一元减号,也称为负数4*相乘5/相除6~/相除,返回整......
  • 无涯教程-Dart - 变量声明
    变量是内存中的命名空间用于存储值。必须先声明变量,然后才能使用它,Dart使用var关键字实现相同的目的。声明变量的语法如下:varname='Smith';dart中的所有变量都存储对值的引用,而不是包含值,名为name的变量包含对值为"Smith"的String对象的引用。Dart通过在变量名称前添加数......
  • 无涯教程-Dart - 数据类型
    编程语言的最基本特征之一是它支持的数据类型集。Dart语言支持以下类型-number  数字类型Strings   字符串类型Booleans布尔类型Lists     列表类型Maps    映射类型number数字类型Dart中的数字用于表示数字。Integer   - 整数值表......
  • 无涯教程-Dart - 基本语法
    语法定义了一组编写程序的规则。让我们从传统的"HelloLearnfk"示例开始-main(){print("HelloLearnfk!");}main()  - 函数是Dart中的预定义方法,此方法充当应用程序的入口点,Dart脚本需要main()方法才能执行。 print()  - 是预定义的函数,可将指定的......