那些你不知道的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中的操作符、流程控制语句和异常,希望大家能够喜欢

目录
相关文章
N..
|
6月前
|
Dart
Dart语言中类的定义和使用
Dart语言中类的定义和使用
N..
63 0
|
6月前
|
Dart 数据安全/隐私保护
Dart笔记:Dart 语言中的存取器及其用法解析
Dart笔记:Dart 语言中的存取器及其用法解析
78 0
|
Dart
[Flutter]足够入门的Dart语言系列之函数:函数定义、调用、5种参数类型和main函数
函数(Function)也被称为方法(Method)。其最直观的理解就是数据中的函数,比如y=f(x),在编程中,f对输入x进行处理,返回结果y,就是一个函数......
1024 0
[Flutter]足够入门的Dart语言系列之函数:函数定义、调用、5种参数类型和main函数
|
3月前
|
Dart 编译器 API
Dart ffi 使用问题之在C++线程中无法直接调用Dart函数的问题如何解决
Dart ffi 使用问题之在C++线程中无法直接调用Dart函数的问题如何解决
|
3月前
|
Dart API C语言
Dart ffi 使用问题之想在C/C++中创建异步线程来调用Dart方法,如何操作
Dart ffi 使用问题之想在C/C++中创建异步线程来调用Dart方法,如何操作
|
4月前
|
Rust
rust 引用了Trait的实现,为什么还需要引入Trait 才能调用实现的方法
rust 引用了Trait的实现,为什么还需要引入Trait 才能调用实现的方法
N..
|
6月前
|
自然语言处理 Dart 算法
Dart语言中函数的定义
Dart语言中函数的定义
N..
47 0
|
Dart 开发者
【Flutter】Dart 面向对象 ( get 方法 | set 方法 | 静态方法
【Flutter】Dart 面向对象 ( get 方法 | set 方法 | 静态方法
934 0
|
Dart 前端开发 JavaScript
dart中将方法当做参数传递时的注意事项
众所周知,Dart是一门面向对象的语言,比Java更纯粹,Dart中的方法也是对象,也有类型Function。这意味着方法可以被分配给对象,也可以当做参数传递给其他方法。
|
Dart
[Flutter]足够入门的Dart语言系列之面向对象:类的定义详解、成员和实例使用
类表示的是分类,一类问题或事物,它是对具体或现实世界的抽象。比如动物类、犬科动物类、猫科动物类、房子类、数学类,类是具体事物的描述,它不是指具体的某个动物、某栋房子、某个数学题,而是对它们的概括...
335 0
[Flutter]足够入门的Dart语言系列之面向对象:类的定义详解、成员和实例使用