【Flutter 1-9】Flutter教程Dart语言——函数和匿名函数
2020-11-21 15:24
183 查看
作者 | 弗拉德
来源 | 弗拉德(公众号:fulade_me)
Dart 同样也是一种面向对象的语音。所以即便函数也是一个对象。类型为
Function,这意味着函数可做作为变量,也也可以作为函数的参数。
函数
下面是定义一个函数的例子:
isEmpty(List aList) { return aList.length == 0; }
为了规范其实我们需要在函数的头部声明一下返回值类型,当然如果不声明也可以运行,
bool isEmpty(List aList) { return aList.length == 0; }
如果函数体内只包含一个表达式,你可以使用简写语法:
bool isEmpty(List aList) => aList == 0;
=>表达的 是
{ return 表达式; }的简写,有时
=>也称之为胖箭头语法。
参数
函数可以有两种形式的参数:必选参数 和 可选参数。必选参数定义在参数列表前面,可选参数一定是定义在必要参数后面。
可选的命名参数
当你调用函数时,可以使用 参数名: 参数值 的形式来指定命名参数。例如:
enableFlags(bold: true, hidden: false);
已命名的参数是可选参数了,除非他们被特别标记为
required。
定义函数时,使用
{param1, param2, …}来指定命名参数:
/// 设置 [bold] 和 [hidden] 标识…… void enableFlags({bool bold, bool hidden}) {...}
虽然命名参数是可选参数的一种类型,但是你仍然可以使用
@required注解来标识一个命名参数是必须的参数,此时调用者则必须为该参数提供一个值。例如:
const Scrollbar({Key key, @required Widget child})
如果调用者想要通过
Scrollbar的构造函数构造一个
Scrollbar对象而不提供 child 参数,则会导致编译错误。
可选参数
使用
[]将一系列参数包裹起来作为可选参数:
strings(String s1, String s2, [String s3]) { var result = '$s1 and $s2'; if (s3 != null) { result = '$result and $s3'; } print(result); }
下面是不使用可选参数调用上述函数的示例:
strings("s1", "s2"); s1 and s2
下面是使用可选参数调用上述函数的示例:
strings("s1", "s2", "s3"); s1 and s2 and s3
默认参数值
我们可以用
=为函数的命名参数和可选参数定义默认值,默认值必须为编译时常量,没有指定默认值的情况下默认值为
null。
下面是设置可选参数默认值示例:
/// 设置 [bold] 和 [hidden] 标识…… void enableFlags({bool bold = false, bool hidden = false}) {...} // bold 的值将为 true;而 hidden 将为 false。 enableFlags(bold: true);
下一个示例 默认值:
strings(String s1, String s2, [String s3 = 'this is s3', String s4]) { var result = '$s1 and $s2'; if (s3 != null) { result = '$result and $s3'; } if (s4 != null) { result = '$result and $s4'; } print(result); } strings("s1", "s2"); s1 and s2 and this is s3
main() 函数
每个
Dart程序都必须有一个
main()顶级函数作为程序的入口,
main()函数返回值为
void。
下面是一个 Flutter 应用的
main()函数示例:
void main() { runApp(MyApp()); }
函数作为参数
可以将函数作为参数传递给另一个函数。例如:
void printElement(int element) { print(element); } // 将 printElement 函数作为参数传递。 var list = [1, 2, 3]; list.forEach(printElement);
你也可以将函数赋值给一个变量,比如:
var loudify = (msg) => '!!! ${msg.toUpperCase()} !!!'; var result = loudify('hello'); print(result);
匿名函数
大多数方法都是有名字的,比如
main()或printElement()。你可以创建一个没有名字的方法,称之为 匿名函数,其实匿名函数很常见,也有不同的叫法,在C++里面叫Lambda表达式,在Objective-C叫Block闭包。你可以将匿名方法赋值给一个变量然后使用它。
匿名方法看起来与命名函数h类似,在括号之间可以定义参数,参数之间用逗号分割。
后面大括号中的内容则为函数体:
([[类型] 参数[, …]]) { 函数体; };
下面代码定义了只有一个参数
item且没有参数类型的匿名方法。
List中的每个元素都会调用这个函数,打印元素位置和值的字符串:
var list = ['apples', 'bananas', 'oranges']; list.forEach((item) { print('${list.indexOf(item)}: $item'); });
如果函数体内只有一行语句,你可以使用胖箭头缩写法。下面代码的运行结果,与上面代码的运行结果是一致的。
list.forEach( (item) => print('${list.indexOf(item)}: $item'));
变量作用域
变量的作用域在写代码的时候就确定了,大括号内定义的变量只能在大括号内访问,与 Java 类似。
下面是一个嵌套函数中变量在多个作用域中的示例:
bool topLevel = true; void main() { var insideMain = true; void myFunction() { var insideFunction = true; void nestedFunction() { var insideNestedFunction = true; assert(topLevel); assert(insideMain); assert(insideFunction); assert(insideNestedFunction); } } }
注意
nestedFunction()函数可以访问包括顶层变量在内的所有的变量。
返回值
所有的函数都有返回值。没有显示返回语句的函数最后一行默认为执行
return null;。
foo() {} assert(foo() == null);
本文所有代码都已上传到Github
相关文章推荐
- 廖雪峰Python教程之匿名函数
- python函数教程:浅谈python之高阶函数和匿名函数
- python函数教程:深入浅析Python 函数注解与匿名函数
- python基础教程之自定义函数介绍
- OllyDbg完全教程 自定义函数描述[Custom function descriptions]
- 《zw版·delphi与halcon系列原创教程》zw版_THOperatorSetX控件函数列表 v11中文增强版
- 直觉化深度学习教程——偏置与激活函数之间的关系
- WEBMAX函数教程
- python基础教程之popen函数操作其它程序的输入和输出示例
- Matlab简单教程:函数
- PowerShell入门教程之函数、脚本、作用域介绍
- Objective-C中的闭包性和匿名函数
- 匿名函数详细讲解
- javascript实例教程(17) 使用javascript的数学函数
- 01-老马jQuery教程-jQuery入口函数及选择器
- JavaScript强化教程——jQuery Callback 函数
- 匿名函数体现在变量的作用域中
- Python中zip()函数用法实例教程
- VBA_Excel_教程:过程,函数
- JavaScript中的匿名函数及函数的闭包