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

韩国恺的博客

hanguokai.com

 
 
 

日志

 
 

Dart 语言入门(二)——函数  

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

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

函数在 Dart 中受到很好的支持。函数的基本语法和 JavaScript 类似,但是不需要输入 function 关键字,这样代码更简练。所有函数都有返回值,没有指定返回值的函数返回 null。

String sayHello(String name){

return 'hello $name';

}

因为 Dart 中的类型是可选的,所以这样写也可以:

sayHello(name){
return 'hello $name';
}

但如果你的函数是对外给别人使用的 API,那么最好包含类型信息。因为明确函数的输入类型和返回类型,别人更容易明白这个函数的意图和限制。

如果函数体中仅仅是简单地返回一个表达式的值,那么可以使用更简练的箭头语法 => expr; ,它等价于 { return expr; } 。所以上面的代码还可以这样写:

sayHello(name) => 'hello $name';


你不仅可以定义一个有名字的函数,还可以使用匿名函数、把函数作为参数传递给其它函数、把函数赋值给一个变量、返回一个函数等。

main() {

var sayHello = (name) => 'hello $name'; // 把一个匿名函数赋值给变量

sayHello('Guokai'); // 利用该变量调用函数

}


函数也是对象,所有的函数都是 Function 类型的对象。Function 有一个静态方法 apply 可以实现动态调用一个函数(当前版本尚未实现)。

sayHello(name) => 'hello $name';

assert(sayHello is Function);


函数闭包可以记住所在词法作用域内的变量的值。

/// 返回一个对参数加 n 的函数
Function makeAdder(num n) {
return (num i) => n + i;
}

main() {
var add2 = makeAdder(2); // 对参数加 2 的函数
var add4 = makeAdder(4); // 对参数加 4 的函数

assert(add2(3) == 5);
assert(add4(3) == 7);
}

for 循环中的函数也一样。

main() {

var callbacks = [];

for (var i = 0; i < 2; i++) {
callbacks.add(() => print(i)); // 在列表 callbacks 中添加一个函数对象,这个函数会记住 for 循环中当前 i 的值。
}
callbacks.forEach((c) => c()); // 分别输出 0 和 1

}


Typedef
可以使用 typedef 关键字定义函数的类型,也就是一个别名,类型信息包含函数的参数和返回值类型。

typedef int Compare(int a, int b);

int sort(int a, int b) => a - b;


main() {

assert(sort is Function);

assert(sort is Compare);

}


在任何代码块中都可以嵌入函数。

foo(x, y){

bar(m){

}

bar(x+y);

}



可选参数
Dart 支持两种类型的可选参数,命名(named)可选参数和位置(positional)可选参数,但不能同时使用。可选的参数可以设置默认值,默认值要求是编译时常量,没有设置的可选参数默认值是 null 。

命名可选参数
命名可选参数使用大括号的语法,默认值用冒号指定。在使用的时候,多个可选参数可以任意指定其中的 0 个或多个,并且与指定的先后顺序无关,但参数值前必须指定参数名。所以参数名也成了 API 的一部分,就像函数的命名一样,需要多花点时间认真考虑参数名。

foo (a, {b, c: 3, d: 4, e}) {

print("$a $b $c $d $e");

}


main() {

// 指定的顺序无关,但必需用参数名指定

// 这里 a 是必选参数,可选参数 b,c,d,e 分别是 null,1,4,5

foo(1, e: 5, c: 1);

}


位置可选参数
位置可选参数使用方括号的语法,默认值用等号指定。在使用的时候,不能定参数名,参数的先后顺序必需与定义的顺序一致,只能省略后面的参数。

foo (a, [b, c=3, d=4, e]) {
print("$a $b $c $d $e");
}

main() {
// 所有可能的调用形式
foo(1);

foo(1, 2);

foo(1, 2, 3);

foo(1, 2, 3, 4);

foo(1, 2, 3, 4, 5);

}


另外,如果你想知道用户是否传递了某个可选参数,可以使用 ?param 语法判断。如果传递了这个参数则 ?param 返回 true。因为仅仅通过可选参数的默认值并不能判断出用户是否传递了这个参数,所以这个语法有时候还是有用的。

foo({x, y}){

if(?x) { // 如果用户实际传递了参数 x ,不管 x 的值是什么

}

}


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

历史上的今天

评论

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

页脚

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