dart学习记录3(函数)
Dart 是面向对象语言,函数也是对象,类型为 Function
。这意味着函数可以赋值给变量或作为参数传递给其他函数
1.箭头表达式
箭头语法只能用于返回一个表达式,不能包含多条语句或代码块
``
int add(int a, int b) => a + b;
=> expr
语法是{ return expr; }
的简写形式。=>
符号有时被称为箭头语法。
2.参数
- 命名参数
命名参数是可选的,除非它们被明确标记为required
,那么必须有命名参数
required
关键字的用途是表明某个参数为必需参数。这意味着在调用函数或者构造函数时,必须为这些参数提供值,不然就会产生编译时错误
使用 {} 定义的是 命名参数,调用时必须通过参数名传值。
void enableFlags({bool? bold, bool? hidden}) { //定义
...
}
enableFlags(bold: true, hidden: false); //调用
enableFlags(hidden: true, bold: false); //调用,命名参数与参数位置无关,通过参数名传递
enableFlags(); //调用,命名参数是可选的,除非它们被明确标记为`required`
required
:修饰的参数是必选参数
void enableFlags({bool? bold, required bool? hidden}) { //定义
...
}
enableFlags(); //错误,hidden参数被标记为required 是必选参数
enableFlags(hidden: true); //正确,参数bold是可选的,hidden参数必选
为参数指定默认值,使用=
。指定的值必须是编译时常量
void enableFlags({bool bold = false, bool hidden = false}) {
...
}
// bold 将为 true;hidden 将为 false。
enableFlags(bold: true);
- 位置参数
位置参数按照函数中参数定义的顺序,在调用时按照顺序依次传参。
void example(bool bold, bool hidden) {
print("bold: $bold, hidden: $hidden");
}
example(true, false); // 只能按顺序传递
位置参数一般不可以省略,除非将一组函数参数包裹在 []
中,将它们标记为可选位置参数。
void say(String name, String msg, [String? device]) {
...
}
say("json", "hello"); //参数三为[]可选参数
say("json", "hello", "Phone");
}
对于可选参数,其类型必须为可空类型,也就是要在类型后面添加 ?。可选参数意味着在调用函数时可以不传入该参数。要是参数类型为非可空类型,在不传入该参数的情况下,函数内部就没有合适的值赋给这个参数。而可空类型它有默认参数为
null
3.main()函数
dart中main原型
void main(List<String> arguments) {
// 这里可以使用接收到的命令行参数
}
可使用args
库来定义和解析命令行参数。
4.匿名函数
匿名函数(Anonymous Function) 是没有名字的函数,通常用于临时计算、回调函数或者闭包。匿名函数可以像普通函数一样接受参数并返回值。
匿名函数(Anonymous Function) 也叫 Lambda 或 箭头函数(如果只有一条语句)。
void main() {
var multiply = (int a, int b) {
return a * b;
};
print(multiply(3, 4)); // 12
}
5.闭包
闭包(Closure)在Dart中其实是一种特殊的函数。它不仅能执行某些操作,还能“记住”它被创建时所在环境中的变量。换句话说,闭包是一个函数加上它外部作用域的变量的组合。
/// 返回一个将 [addBy] 添加到函数参数的函数。
Function makeAdder(int addBy) {
return (int i) => addBy + i;
}
void main() {
// 创建一个加 2 的函数。
var add2 = makeAdder(2);
// 创建一个加 4 的函数。
var add4 = makeAdder(4);
assert(add2(3) == 5);
assert(add4(3) == 7);
}
makeAdder() 捕获了变量 addBy。无论返回的函数走到哪里,它都会记住 addBy。
闭包的特点
- 访问外部作用域:闭包可以访问它定义时外部的变量。
- 持久化记忆:即使外部函数已经执行完毕,闭包仍然能记住那些变量。
- 动态更新:如果外部变量变了,闭包里的值也会跟着变。
6.撕裂
撕离(Tear-offs)是一种语法特性,允许你直接引用一个函数或方法(包括构造函数),将其作为函数值传递或赋值,而无需显式地创建一个新的函数包装器。它本质上是将现有函数或方法的引用“撕下来”使用。
撕离的基本概念
- 当你有一个命名函数、方法或构造函数时,可以通过
省略调用时的括号 ()
来获取它的引用,而不是直接调用它。 - 撕离的结果是一个函数对象(Function 类型),可以存储在变量中、传递给其他函数或稍后调用。
函数撕裂
void sayHello(String name) {
print("Hello, $name!");
}
void main() {
// 撕离:将函数 sayHello 的引用赋值给变量
var greet = sayHello; // 注意没有括号 ()
// 使用撕离后的函数
greet("Alice"); // 输出: Hello, Alice!
}
方法撕裂
class Person {
void introduce(String name) {
print("My name is $name.");
}
}
void main() {
var person = Person();
// 撕离实例方法
var intro = person.introduce; // 注意没有括号 ()
// 调用撕离后的方法
intro("Bob"); // 输出: My name is Bob.
}
应用场景
- 回调函数:将撕离后的函数传递给需要回调的地方,例如事件监听。
- 简化代码:避免手动定义匿名函数,直接复用已有函数。
- 函数式编程:与高阶函数(如 map、forEach)结合使用。
7.函数返回值
所有函数都返回一个值。如果未指定返回值,语句 return null; 会被隐式添加到函数体中。即未指定返回值则返回null
foo() {}
assert(foo() == null);
8.生成器
官方文档看不懂
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/592413.html 如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!