Dart 语言入门 2: 函式 Function

Functions 函数(方法)

在Dart语言,函数是物件也是一种叫做Function的型态(type)。因此,Function可以当成变数,也可以当做其他函数的参数;另外亦可把类别(class)的实体(instance)当做函数来呼叫。
建议为每个函数的参数以及回传值都指定类型。

定义

//定义一个函数 判断清单对应参数是否为nullbool isNoble(int atomicNumber) {return list[atomicNumber] != null;}

对于只有一个表达式的方法,可以选择使用缩写语法来定义

//定义一个函数 判断清单对应参数是否为null 缩写写法bool isNoble(int atomicNumber) => list[atomicNumber] != null;

=> 胖箭头: 简写语法用于仅包含一句表达式的函数。这个语法特别是在将匿名函数作为参数传递时非常有用。
且在 => 与 ; 之间的只能是表达式,而非语句。例如你不能将一个 if语句 放在其中,但是可以放置条件表达式(condition ? expr1 : expr2)。

参数

有两种类型的参数:必需和可选的。
必需的参数在参数列表前面,可选参数则是放置于必需参数的后面。

可选参数

可选参数分为命名参数和位置参数,可在参数列表中任选其一使用,但两者不能同时出现在参数列表中。

命名参数

定义函数时,使用 {param1, param2, …} 来指定命名参数

void enableFlags({bool bold, bool hidden}) {...}

当你呼叫函数时,可以使用 参数名: 参数值 的形式来指定命名参数。:例如:

enableFlags(bold: true, hidden: false);

虽然命名参数是可选参数的一种,但是你仍然可以使用 @required 注解来标识一个命名参数是必须的参数,此时呼叫程式则必须为该参数提供一个值。例如:

const Scrollbar({Key key, @required Widget child})

如果想要使用 Scrollbar 的建构式产生一个 Scrollbar 物件而不提供 child 这个参数,则会导致编译错误。
@required 注解定义在 meta 套件中,可以直接导入 package:meta/meta.dart 使用。

位置参数

使用 [] 将一系列参数包裹起来作为位置参数:

String say(String from, String msg, [String device]) {  var result = '$from says $msg';  if (device != null) {    result = '$result with a $device';  }  return result;}

下面是不使用可选参数呼叫say函数的例子

assert(say('Bob', 'Howdy') == 'Bob says Howdy');

下面是使用可选参数呼叫say函数的例子

assert(say('Bob', 'Howdy', 'smoke signal') == 'Bob says Howdy with a smoke signal');

预设参数值

可以用 = 为函数的命名和位置参数定义预设值,预设值必须为编译时常量,没有指定预设值的情况下预设值为 null。

void main() {  String say(String from, String msg,      [String device = 'carrier pigeon', String mood]) {    var result = '$from says $msg';    if (device != null) {      result = '$result with a $device';    }    if (mood != null) {      result = '$result (in a $mood mood)';    }    return result;  }  assert(say('Bob', 'Howdy') == 'Bob says Howdy with a carrier pigeon');}

List 或 Map 同样也可以作为预设值。下面的範例定义了一个 doStuff() 的函数,其中的参数 list 和 gifts 指定了一个 List 类型的值和 Map 类型的值。

void main() {  var list1 = [4,5,6];  var map1 = {'first':'one','second':'two','third':'three'};    void doStuff(      {List<int> list = const [1, 2, 3],      Map<String, String> gifts = const {        'first': 'paper',        'second': 'cotton',        'third': 'leather'      }}) {    print('list:  $list');    print('gifts: $gifts');  }  doStuff();  doStuff(list:list1,gifts: map1);}

http://img2.58codes.com/2024/20121852LW2qiM8i0O.png

综合範例

引用 IT人

//num a, num b, num c, num d 最普通的传参: 呼叫时,引数个数和引数顺序必须固定add1(num a, num b, num c, num d) {  print(a + b + c + d);}//[num a, num b, num c, num d]传参: 呼叫时,引数个数不固定,但是引数顺序需要一一对应, 不支援命名引数add2([num a, num b, num c, num d]) {  print(a + b + c + d);}//{num a, num b, num c, num d}传参: 呼叫时,引数个数不固定,引数顺序也可以不固定,支援命名引数,也叫可选引数,是dart中的一大特性,这就是为啥Flutter程式码那么多可选属性,大量使用可选引数add3({num a, num b, num c, num d}) {  print(a + b + c + d);}//num a, num b, {num c, num d}传参: 呼叫时,a,b引数个数固定顺序固定,c,d引数个数和顺序也可以不固定add4(num a, num b, {num c, num d}) {  print(a + b + c + d);}main() {  add1(100, 100, 100, 100); //最普通的传参: 呼叫时,引数个数和引数顺序必须固定  add2(100, 100); //呼叫时,引数个数不固定,但是引数顺序需要一一对应, 不支援命名引数(也就意味着顺序不变)  add3(      b: 200,      a: 200,      c: 100,      d: 100); //呼叫时,引数个数不固定,引数顺序也可以不固定,支援命名引数(也就意味着顺序可变)  add4(100, 100, d: 100, c: 100); //呼叫时,a,b引数个数固定顺序笃定,c,d引数个数和顺序也可以不固定}
add3({num a, num b, num c, num d = 100}) {//d就是预设值引数,给的预设值是100   print(a + b + c + d);             //1200}main() {    add3(b: 200, a: 100, c: 800);}
main() {  Function square = (a) {    return a * a;  };  Function square2 = (a) {    return a * a * a;  };  print(add(3, 4, square, square2));           //9+64=73}num add(num a, num b, [Function op, Function op2]) {  //函式作为引数传递  return op(a) + op2(b);}

main() 函数

每个程式都必须有一个 main() 函数作为入口,main() 函数回传值为 void 并且有一个 List <String> 类型的可选参数。

void main(List<String> arguments) {  print(arguments);  print(arguments.length);  print(arguments[1]);}

http://img2.58codes.com/2024/201218528jhRhP2Tdw.png

匿名函数

没有名字的函数,称之为 匿名函数,或 Lambda表达式 或 Closure闭包。
你可以将一个变数设为匿名函数,然后使用它,亦可将该变数添加到集合或从中删除。
匿名函数看起来与命名函数类似,在括号之间可以定义参数,参数之间用逗号分割;后面大括号中的内容则为函数体:
([[类型] 参数[, …]]) {
函数体;
};

void main() {  var loudify = (msg) => '!!! ${msg.toUpperCase()} !!!';  print(loudify('hello'));            //!!! HELLO !!!}
void main() {  var list = ['apples', 'bananas', 'oranges'];  list.forEach((item) {    print('${list.indexOf(item)}: $item');      });}

http://img2.58codes.com/2024/20121852LSVQxJ6dRf.png

支援闭包(closure)

函数可以封闭定义到它範畴(scope)内的变数。接下来的範例中,函数 makeAdder() 设定了变数 addBy。无论函数在什么时候return,它都可以使用设定的 addBy 变数。

Function makeAdder(int addBy) {  return (int i) => addBy + i;}void main() {  // 生成加 2 的函数。  var add2 = makeAdder(2);  // 生成加 4 的函数。  var add4 = makeAdder(4);  print(add2(3));     //5  print(add4(3));     //7}

关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章