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

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.生成器

官方文档看不懂

原文地址:https://blog.csdn.net/qq_43469158/article/details/146372770
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/592413.html

相关文章:

  • 蓝桥杯备考----》快速幂算法之乘方
  • 大模型开发(六):LoRA项目——新媒体评论智能分类与信息抽取系统
  • 力扣100二刷——图论、回溯
  • electron框架(1.0)认识electron和基础创建
  • 使用PyMongo操作MongoDB(一)
  • MR-Flink-Spark任务提交-常用命令
  • 物联网的数据传输与处理!
  • [GHCTF 2025]真会布置栈吗?
  • WebGL学习2
  • 【红黑树】—— 我与C++的不解之缘(二十五)
  • Windows 图形显示驱动开发-WDDM 3.0功能- 硬件翻转队列(四)
  • K-均值聚类
  • Python 实现高效的实体扩展算法
  • 正点原子[第三期]Arm(iMX6U)Linux移植学习笔记-6.2uboot启动流程-lowlevel_init,s_init,_main函数执行
  • Windows 11右键菜单栏如何修改为Windows 10风格【完整教程】以及如何恢复Win11菜单栏风格
  • 技术改变生活:探索新科技的力量与影响
  • element-plus中Dropdown下拉菜单组件的使用
  • 论文解读:含可靠置信度的视频超分辨显微成像(频域卷积+贝叶斯深度学习)
  • vscode 配置服务器远程连接
  • 构建下一代AI Agent:自动化开发与行业落地全解析