那些你不知道的Dart细节之函数(方法)(三)

简介: Dart中的函数,也就是方法

前言

前两篇文章分别讲解了Dart中的变量和内置类型,对Dart的基本语法已经有了了解,那么今天来说一下Dart中的函数,也就是方法。前两篇文章没有看的,建议先看一下前两篇文章。

那些你不知道的Dart细节之变量

那些你不知道的Dart细节之内置类型

那些你不知道的Dart细节之函数(方法)

那些你不知道的Dart细节之操作符、流程控制语句、异常

那些你不知道的Dart细节之类的点点滴滴

那些你不知道的Dart细节之泛型和库

定义

可在函数内定义

void main(){
  void test(){
  }
}

和Java不同,Dart中的函数可以定义在函数内部(和Java的匿名内部类别搞混了)

定义函数时可省略类型(不建议)

main(){
  test(){
    // return null;
  }
}

上面的函数可以写成下面这样,Dart中函数是Function类型的对象。所有的函数都返回一个值。如果没有指定返回值,则 默认把语句 return null; 作为函数的最后一个语句执行。

支持缩写语法 => (Kotlin是用=来实现)

main(){
  print(test1());
}
test()=> "zhujiang";
String test1(){
  return "zhujiang";
}

上面代码中的test()和test1()效果是一样的,“=>”相当于大括号和return

可选参数

既然是函数,那么肯定要传参,我在经过Java构造方法的摧残之后,看这个功能的时候泪流满面😭。为什么会这样呢?下面先来看一个咱们的Java类的构造函数:


public class Test {
    private String name;
    private int age;
    private String address;
    public Test(String name, int age, String address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }
    public Test(String name, String address) {
        this.name = name;
        this.address = address;
    }
    public Test(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public Test(String name) {
        this.name = name;
    }
}

一个非常简单的构造方法,只是想要传参数形式多一点,竟然需要写这么多重载方法。。。那么下面咱们来看一下拿Dart写的同样功能的代码:

class Test{
  String name;
  int age;
  String address;
  Test(this.name, {this.age, this.address});
}

What?竟然可以这样?是的,可以这样。下面来详细说一下函数的可选参数。

可选命名参数

其实上面构造方法我使用的就是可选命名参数,写的时候其实很简单,只需要加上大括号就行。下面是使用方法:

main() {
  print(add(a: 1, b: 3));
}
int add({int a = 1, int b}) {
  return a + b;
}

上面的add方法调用的时候可以不填参数,也可以填任何一个参数,也可以将参数都填上。这里要注意:


如果a不填的话,默认值就是1,如果b不填,默认值就是null。

传参数的时候一定要记得写a:,不然会报错。

可选位置参数

和上面的可选命名参数不同,上面的函数如果想调用,必须命名再加上冒号才能使用,可选位置参数就不需要了。这里和上面一样,默认值可加可不加:

int add2(int a,[int b = 2,int c = 3]) {
  return a + b;
}

下面是上面add2()方法的几种调用方式:

print(add2(1));
  print(add2(1,2));
  print(add2(1,1,3));

注意

上面的可选命名参数和可选位置参数,可使用list或map作为默认值,但必须是const。

int add3({List a = const [1,2,3], int b = 2}) {
  return b;
}

匿名函数

可赋值给变量,通过变量调用。可在其他函数中直接调用或传递给其他函数。匿名函数分为无参匿名函数和有参匿名函数:

无参匿名函数

var printFun = () => print("**无参匿名函数**");

有参匿名函数

var printFun2 = (name) => print("**有参匿名函数 $name**");
printFun2("sss");

这里还有一个小的知识点:可以通过()调用,不推荐。

(() =>print("***可以通过()调用,不推"))();

闭包

这里感觉没什么好说的,大家直接看代码应该就可以理解:

Function makeAddFunc(int x) {
  x++;
  return (int y) => x + y;
}
var makeAddFun = makeAddFunc(11);
print(makeAddFun(10));

就是创建一个方法,返回的也是一个方法,可以再继续调用。

函数别名

用typedef给函数起一个别名,使用比较方便。例如定义一个方法的回调,直接使用别名定义。没返回值,则只要参数匹配就行了,如果定义了返回值,则返回值不一样会报错。

typedef Fun1(int a, int b);
typedef Fun2<T, K>(T a, K b);
int add(int a, int b) {
  print('a + b');
  return a + b;
}
class Demo1 {
  Demo1(int f(int a, int b), int x, int y) {
    var sum = f(x, y);
    print("sum1 = $sum");
  }
}
class Demo2 {
  Demo2(Fun1 f, int x, int y) {
    var sum = f(x, y);
    print("sum2 = $sum");
  }
}
class Demo3 {
  Demo3(Fun2<int, int> f, int x, int y) {
    var sum = f(x, y);
    print("sum3 = $sum");
  }
}

上面代码就是定义函数别名的方法,下面是调用方法:

Fun1 fun1 = add(11, 12);

总结

到这里Dart的第三篇文章就结束了,本篇文章主要讲解了一下Dart语言的函数(方法)。下一篇文章讲解一下Dart中的操作符、流程控制语句和异常,希望大家能够喜欢

目录
相关文章
|
监控 API C++
利用C++构建PC端监控软件:实时屏幕录制
在今天的数字化世界中,监控软件变得越来越重要。无论是家庭用户需要监控他们的孩子,还是企业需要监控员工的电脑活动,实时屏幕录制是一种有效的方法。本文将向您介绍如何使用C++构建PC端监控软件,实现实时屏幕录制功能。此外,我们还将讨论如何自动提交监控到的数据到一个网站上。
852 0
|
JSON 数据格式
layui富文本编辑器文档layedit组件的调用和图片上传接口的使用
layui富文本编辑器文档layedit组件的调用和图片上传接口的使用
804 0
|
小程序 开发者
微信小程序通过普通二维码扫码进入指定页面带参数
微信小程序通过普通二维码扫码进入指定页面带参数
|
存储 关系型数据库 Linux
PostgreSQL命令行安装【静默安装】的全部流程
想要实现通过GUI软件一键安装PostgreSQL的功能,免去手动安装的过程,也可以添加一些对pgsql服务的管理功能。 这就要用到PostgreSQL通过命令行静默安装,放在软件中实现控制...
2460 0
PostgreSQL命令行安装【静默安装】的全部流程
|
机器学习/深度学习 自然语言处理 TensorFlow
迁移学习入门指南超棒!教你如何利用预训练模型加速 TensorFlow 项目开发,开启高效之旅!
【8月更文挑战第31天】在深度学习领域,迁移学习是种在资源有限的情况下快速开发高性能模型的技术。本指南介绍如何在TensorFlow中利用预训练模型实现迁移学习,包括选择、加载预训练模型、自定义顶层、冻结预训练层及训练模型等内容,以帮助提升模型性能和训练速度。
414 0
|
SQL 分布式计算 MaxCompute
一种基于ODPS SQL的全局字典索引分布式计算思路
本文提供一种能充分利用分布式计算资源来计算全局字典索引的方法,以解决在大数据量下使用上诉方式导致所有数据被分发到单个reducer进行单机排序带来的性能瓶颈。
|
小程序 搜索推荐 算法
计算机毕业设计参考-微信小程序实现的校园餐饮预订与点餐平台源码
该系统分为管理端、小程序用户端和商户端三部分。管理端提供商品分类、商品、评价、订单和用户管理等功能,以及商户管理功能,可以管理商户信息、发布商品、查看店铺订单等。小程序用户端提供商品浏览、商品搜索、购物车、商品下单、个人信息、收货地址等功能,并使用基于协同过滤的推荐算法进行商品推荐。商户端提供与管理端相同的功能,并可以设置店铺信息和发布商品。用户和商户可以使用手机号码登录,获取验证码登录系统。该系统为校园点餐提供了一种方便快捷的解决方案,可以有效提升用户点餐的体验和商户的管理效率。
|
机器学习/深度学习 算法 atlas
RAG 2.0架构详解:构建端到端检索增强生成系统
RAG(检索增强生成)旨在通过提供额外上下文帮助大型语言模型(LLM)生成更精准的回答。现有的RAG系统由独立组件构成,效率不高。RAG 2.0提出了一种预训练、微调和对齐所有组件的集成方法,通过双重反向传播最大化性能。文章探讨了不同的检索策略,如TF-IDF、BM25和密集检索,并介绍了如SPLADE、DRAGON等先进算法。目前的挑战包括创建可训练的检索器和优化检索-生成流程。研究表明,端到端训练的RAG可能提供最佳性能,但资源需求高。未来研究需关注检索器的上下文化和与LLM的协同优化。
1908 1
|
小程序 程序员 API
微信开发之openApi管理
微信开发之openApi管理
314 0
|
程序员 uml
UML学习(一)----使用plantuml画时序图
之前都是使用processon来画UML图,虽说有很多模板,画图也比较方便。但是,非会员的话最多只能保存14张图,这就很坑了。每次对图的变更也不太方便,所以琢磨了下,发现了一款好用的画UML图的工具plantuml。 PlantUML是一个开源项目,支持采用编码的方式快速绘制图。这对于我们广大程序员而言无疑是很大的福音。PlantUML的官方文档。
616 0
UML学习(一)----使用plantuml画时序图