当前位置: 首页 > news >正文

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。

闭包的特点

  1. 访问外部作用域:闭包可以访问它定义时外部的变量。
  2. 持久化记忆:即使外部函数已经执行完毕,闭包仍然能记住那些变量。
  3. 动态更新:如果外部变量变了,闭包里的值也会跟着变。

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.
}

应用场景

  1. 回调函数:将撕离后的函数传递给需要回调的地方,例如事件监听。
  2. 简化代码:避免手动定义匿名函数,直接复用已有函数。
  3. 函数式编程:与高阶函数(如 map、forEach)结合使用。

7.函数返回值

所有函数都返回一个值。如果未指定返回值,语句 return null; 会被隐式添加到函数体中。即未指定返回值则返回null

 foo() {}
 assert(foo() == null);

8.生成器

官方文档看不懂

相关文章:

  • 三.ffmpeg对yuv的操作
  • SSH连接中断原因分析(SSH断开、SSH中断、SSH连接断开、远程断开、远程中断)(带宽不足、网络抖动与丢包、CPU资源耗尽、内存不足、磁盘I/O瓶颈)
  • 解锁物联网高效开发,Synaptics SYN43756E Wi-Fi 6E 芯片登场
  • 打造无缝智慧照明场景,涂鸦智能全新发布蓝牙Mesh照明解决方案
  • AI Agent系列(六) -基于ReAct架构搭建LLM Agent(Deepseek)
  • C语言中的函数
  • 动平衡仿真程序设计
  • SpringSecurity——如何获取当前登录用户的信息
  • jekins启动失败排查
  • matrix-breakout-2-morpheus通关攻略
  • 蓝桥杯 - 中等 - 新手引导
  • Oracle数据库与MySQL数据库的全面对比分析
  • SpringBoot对接DeepSeek
  • 模板方法设计模式在事件处理中的应用
  • JavaScript 金额运算精度丢失问题及解决方案
  • 【LLMs篇】05:RMSNorm
  • AI 大模型统一集成|微服务 + 认证中心:如何保障大模型 API 的安全调用!
  • docker 部署elk 设置账号密码
  • MAT 启动报错
  • MySQL数据库精研之旅第一期:开启数据管理新旅程
  • 体坛联播|双杀阿森纳,巴黎晋级欧冠决赛对阵国际米兰
  • 中国经济新动能|警惕数字时代下经济的“四大极化”效应
  • 央行:将支持资本市场两项货币政策工具的额度合并使用
  • AI世界的年轻人|“热潮下要有定力”,她的目标是让机器人真正步入家庭
  • 戴紫薇评《不像说母语者》丨后殖民语境下的母语追寻
  • 贵州黔西游船倾覆事故70名落水人员在院救治,均为轻伤