标签:
在前面的教程中,我们已经接触了一些函数,比如print函数。Dart中的函数与其他常见语言(如C、C#、Java)中的函数非常相像。如
var y = f(x);
表示调用函数f并传递实参x,以它的返回值初始化变量y。
现在比较系统的介绍Dart中函数。
一、定义
1.1 一般方式
定义函数的格式为:
// 伪代码 返回值类型 函数名(参数列表) { 函数体 }
参数列表的格式为
// 伪代码 T_1 p_1, T_2 p_2, ..., T_i p_i, ..., T_n p_n
诸T_i表示参数的类型,诸p_i表示参数名。如果没有参数,则参数列表为空。
如果函数没有返回值,则返回值类型为void。
// 例1 // 接受2个int,返回int的函数 int Func1(int a, int b) { return a + b; } // 例2 // 接受1个String,没有返回值的函数 void Func2(String a) { print(a); } // 例3 // 没有参数,返回String的函数 String Func3() { return "Dart引领未来"; }
像许多常见语言一样,关键字return表示函数的返回。
1.2 简洁方式
如果函数f有返回值(此时f必有return语句),且return语句就是全部的函数体,那么可以用=>来定义函数:
int Func1() => 1; int Func2(int x) => Func1() + x + 5;
这里
=> r;
等价于
{ return r; }
如果函数没有返回值,且函数体只有一条语句,那么也可以用=>来定义函数:
void Func3() => print("Dart了不起");
这里
=> r;
等价于
{ r; }
二、可选参数
2.1 针对参数名称的可选参数
如果我们想编写一个函数PrintComplex,它以复数的实部和虚部为参数,如果不提供虚部,则认为虚部为零,怎么做呢?Dart提供了可选参数。
void PrintComplex(num a, {num b: 0}) { print("${a} + ${b}i"); }
用{}括起来的参数是可选的,并且用冒号(:)指定参数的默认值,PrintComplex的参数b的默认值为0。
调用该函数可以采用下面的方式:
PrintComplex(1.2); // 传递1个参数 PrintComplex(35, b: 90.24); // 传递2个参数
向可选的参数传值必须指定名字,不能像C++那样直接PrintComplex(1, 2);。
再举一例:
void main() { Func(100, 200); Func(1, 2, d: 20); // 提供d,不提供c Func(2, 4, c: 10); // 提供c,不提供d Func(-1, -2, c: -3, d: -4); } void Func(int a, int b, {int c: 20, int d: 25}) { print("a = ${a}, b = ${b}, c = ${c}, d = ${d}"); }
2.2 针对参数位置的可选参数
如果把可选参数用[]包括起来,那么这些可选参数就是针对参数位置的可选参数。
void Func(int a, int b, [int c = 20, int d = 25]) { print("a = ${a}, b = ${b}, c = ${c}, d = ${d}"); }
在调用Func时,可以传递2或3或4个参数。
void main() { Func(20, 21); Func(1, 2, 10); Func(100, 42, 9078, -1); }
更一般的,设函数
// 伪代码 void Func(T_1 p_1, T_2 p_2, ..., T_m p_m, [R_1 q_1 = v_1, R_2 q_2 = v_2, ..., R_n q_n = v_n]) { // 函数体 }
则可以向Func传递m、m+1、m+2、...、m+n个参数。
提供的实参会从左至右依次传入。
标签:
原文地址:http://my.oschina.net/jthmath/blog/419599