那些你不知道的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端监控软件,实现实时屏幕录制功能。此外,我们还将讨论如何自动提交监控到的数据到一个网站上。
986 0
|
Dart 编译器 API
Dart笔记:Dart 库
Dart笔记:Dart 库
414 0
|
SQL 关系型数据库 MySQL
Python 与 MySQL 进行增删改查的操作以及防止SQL注入
Python 与 MySQL 进行增删改查的操作以及防止SQL注入
620 0
|
Kotlin
kotlin 使用let与run结合,等价于if 与else
Kotlin 中?.let{}?:run{} 等价于 if{}else{}
443 1
|
机器学习/深度学习 自然语言处理 TensorFlow
迁移学习入门指南超棒!教你如何利用预训练模型加速 TensorFlow 项目开发,开启高效之旅!
【8月更文挑战第31天】在深度学习领域,迁移学习是种在资源有限的情况下快速开发高性能模型的技术。本指南介绍如何在TensorFlow中利用预训练模型实现迁移学习,包括选择、加载预训练模型、自定义顶层、冻结预训练层及训练模型等内容,以帮助提升模型性能和训练速度。
516 0
|
Python
深入理解Python中的类方法、类实例方法和静态方法
深入理解Python中的类方法、类实例方法和静态方法
658 0
|
Android开发 开发者 Kotlin
Android 多进程情况下判断应用是否处于前台或者后台
本文介绍在多进程环境下判断Android应用前后台状态的方法。通过`ActivityManager`和服务信息`RunningAppProcessInfo`可有效检测应用状态,优化资源使用。提供Kotlin代码示例,帮助开发者轻松集成。
1367 8
|
开发者 Python
Python 中的 Input 函数及其实现机制
Python 中的 Input 函数及其实现机制
1409 0
|
前端开发 JavaScript
mvvm/mvc/mvp三者区别
mvvm/mvc/mvp三者区别
589 3
|
程序员 uml
UML学习(一)----使用plantuml画时序图
之前都是使用processon来画UML图,虽说有很多模板,画图也比较方便。但是,非会员的话最多只能保存14张图,这就很坑了。每次对图的变更也不太方便,所以琢磨了下,发现了一款好用的画UML图的工具plantuml。 PlantUML是一个开源项目,支持采用编码的方式快速绘制图。这对于我们广大程序员而言无疑是很大的福音。PlantUML的官方文档。
792 0
UML学习(一)----使用plantuml画时序图