注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

韩国恺的博客

hanguokai.com

 
 
 

日志

 
 

Dart 语言入门(五)——库的使用  

2012-11-25 11:54:13|  分类: Dart |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
更新日期:2012年12月27日

在 Dart 中有库(library)的概念,你可以导入一个库使用它提供的功能,也可以自己定义一个可重用的库。尽管这是很多 server 端语言都支持的概念,但在 JavaScript 尚不支持。如果你用 Dart 编写 Web 应用就可以利用这点,帮你更好地组合代码。一个库可以由一个或多个文件组成。

任何 Dart 应用程序都是一个库,即使没有使用 library 声明。import 用于导入一个库,library 用于定义一个库,part 用于将其他文件包含到当前库的定义中。

私有概念在 Dart 中,以下划线开头的成员是私有的。注意,Dart 中的私有单元是库,而不是类。私有是指在库的外部不可见,而在库的内部是完全可见的。比如,你在类中定义了一个私有方法,实际上在类所在的库中是完全可见的。


1. import 语句

import 语句可以导入一个库,然后你就可以使用该库中定义的所有成员了。例如,下面是导入 dart:html 库的 import 语句:

import 'dart:html'; // 导入 Dart 标准库

在 import 关键字后面通过一个字符串形式的 URI 来指定要导入的库。Dart 的标准库使用 dart: 前缀的格式,如 dart:html、dart:io 等。你也可以导入一个绝对或相对路径的 dart 文件,如:

import 'lib/unittest.dart'; // 导入文件

Dart 有自己的包管理系统 Pub,通过包管理系统导入一个库使用 package: 前缀的格式,如:

import 'package:mylib/mylib.dart'; // 导入包管理系统下的库

import 'package:unittest/unittest.dart';


前缀导入
如果导入的多个库之间或者导入的库与当前代码有命名冲突,那么可以给导入的库设置一个前缀来避免冲突。只要在 import 末尾添加一个 as 语句:

import 'package:lib1/lib1.dart';
import 'package:lib2/lib2.dart' as lib2; // 给 lib2.dart 定义一个前缀命名空间

var element1 = new Element(); // 没有加 lib2 前缀时,使用的是 lib1.dart 中提供的 Element
var element2 = new lib2.Element(); // 要是使用 lib2 中的 Element,需要在名字前面加上 lib2.


部分导入(选择性导入)
你可以只导入库的一部分成员,Dart 支持“白名单”和“黑名单”的过滤概念。“白名单”就是只导入指定的成员,“黑名单”就是导入所有成员除了指定的成员。他们分别通过末尾的 show 和 hide 指定。部分导入的主要目的是为了避免命名冲突,你可以导入其中的一部分。

import 'package:lib1/lib1.dart' show foo, bar; // 只导入 lib1 中的 foo 和 bar 这两个成员。
import 'package:lib2/lib2.dart' hide foo; // 导入 lib2 中除了 foo 之外的所有成员。


2. library 语句
使用 library 加上一个标示符定义当前库的名字。不过库的名字并不影响导入,因为 import 语句用的是 URI 而不是库的名字。

library box2d; // 定义这个库的名字是 box2d


3. part 和 part of 语句
如果一个库的所有代码都写在一个文件中,会导致文件太大不好维护。Dart 允许你把代码写在多个文件中,并使用类似 include 的机制把多个文件包含到库的主文件中。库的主文件就是定义 library 语句所在的文件,在这个文件中可以使用 part 语句包含其它文件。part 语句的语法是 part 加上字符串形式的 fileUri 。与 part 语句相对应的是 part of 语句,需要在被包含的文件的顶部使用 part of 语句声明这个文件属于哪个库。

library 语句所在的主文件中可以使用 import 和 part 语句,但 part of 所在的实现文件中不能使用任何 import、library 和 part 语句。库使用的所有 import 和 part 语句都必需放在主文件中声明。

例如我们定义一个叫 math 的数学库,它由3个文件组成,一个主文件 math.dart,和2个实现文件,主文件 math.dart 除了包含实现文件外什么也不做。

// 在 math.dart 文件中

library math;
part 'base.dart';

part 'random.dart';


// 在 base.dart 文件的开头

part of math;



// 在 random.dart 文件的开头

part of math;



4. export 语句
你可以使用 export 语句重新导出库,比如:把多个较小的库组合为一个较大的库或者重新导出库的一部分作为一个新的库。既可以导出库的全部,也可以导出库的一部分(使用 show 和 hide)。

下面的示例中,french 库中定义了两个函数,在 togo 库中重新导出了 french 库,但只导出了其中的一个函数。在使用 togo 库的时候,只能看到导出的那个函数。

// In french.dart:
library french;
hello() => print('Bonjour!');
goodbye() => print('Au Revoir!');

// In togo.dart:
library togo;
import 'french.dart';
export 'french.dart' show hello; // 重新导出,但只导出一部分

// In another .dart file:
import 'togo.dart';

void main() {
hello(); // 可以使用 hello
goodbye(); // 错误,goodbye 是不可见的
}


5. import 和 library 的作用域
命名冲突总是件讨厌的事。为了减少遇到命名冲突的情况,Dart 区分 library 和 import 的作用域,库的作用域在当前代码的外围,而不是平级的。如果你的当前代码和导入的库中都定义了一个相同名字的成员,那么实际是当前代码中的定义生效,类似于局部变量屏蔽全局变量。

Dart 只关心当前代码中“实际使用”的命名冲突,如果导入的两个库中有相同的名字,但当前代码并没有使用这个名字就不会有命名冲突,只在当前代码使用的情况下才会发生命名冲突。

  评论这张
 
阅读(1882)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018