美文网首页
Dart基础(四)-函数

Dart基础(四)-函数

作者: 苍眸之宝宝 | 来源:发表于2022-01-06 09:12 被阅读0次

简介:

Dart是一种真正的面向对象语言,所以函数也是对象,并且有一个类型Function。这意味着函数可以赋值给变量,也可以作为参数传递给其他函数。您还可以调用Dart类的实例,就像它是一个函数一样。有关详细信息,请参见Callable类。

  要点总结:

  • 函数也是对象,且函数有对应的类Function;
  • 函数可以作为变量,也可作为函数的参数;
  • 类的实例也可以像函数一样调用,见可调用类;

函数的声明和实现:

  函数实现:

returnType functionName(param1, param12, ...) {
 code
 return type;
}

一些注意点:

  • 返回类型可以省略,但是为了可读性一般不会省略;
  • 当返回类型为void时,reutrn语句为return null;可以省略;
  • 箭头语法=> expr{return expr;}的省略写法,且=>;之间只有表达式不能出现语句;
// 例子
bool isNoble(int atomicNumber) {
  return _nobleGases[atomicNumber] != null;
}

// 省略返回值
isNoble(atomicNumber) {
  return _nobleGases[atomicNumber] != null;
}

// 箭头语法
bool isNoble(int atomicNumber) => _nobleGases[atomicNumber] != null;

函数参数:

一个函数可以有任意数量的所需位置参数。后面可以跟命名参数,也可以跟可选的位置参数(但不能同时跟)。

  参数分类

类别 中文 描述
No Named parameters 匿名参数 调用函数时不用参数的名字
Named parameters 命名参数 {} 内,调用函数时需要参数的名字
Optional Named parameters 可选命名命名参数 调用函数时该参数不是必传参数
required parameters 必传参数 调用函数时必传该参数
Optional positional parameters 可选位置参数 应用程序的入口

注意点:

  • {}内必传参数需要加required关键字;
  • {}内可选不为空的参数,必须提供默认值;
  • {}内可选为空的参数,需要?允许参数为null;
  • []内可选位置参数,基本上没用。
// 匿名必传参数
void showName(String name) {
  print(name);
}
// 调用
showName("Luck");

// 命名参数:name为命名必传参数;age和sex是可选命名参数,不能为空,需提供默认值;hadCar是可选默认参数,可以为null
void show({ required String name, int age = 0, bool sex = true, bool? hadCar}) {
  print('name = $name, age = $age, sex = ${sex ? 'man' : 'woman'}');
  if (hadCar == true) {
    print('$name had car');
  }
}
// 调用
show(name: "Lucy", age: 12, sex: true, hadCar: true);

函数分类:

  函数分类:

类别 中文 描述
main() 主函数或者入口函数 应用程序的入口
Global function 全局函数 main之外定义的函数,或是直接在main函数中定义的函数都是全局函数,可以可以全局调用
Local function 局部函数 相对全局函数定义,不是全局函数的,都是局部函数
instance function 实例函数 类实例调用的函数
class/static function 类函数或者静态函数 类名直接调用的函数
Anonymous function 匿名函数 没有名字的函数,也被称为(java中)lambda 或者 (swift中)closure 闭包

main()函数:

每个应用程序都必须有一个顶级的main()函数,它作为应用程序的入口点。main()函数返回void,并有一个可选的List<String>参数作为参数。

// main之外定义的全局函数
int globalOutMain() {
    return 123;
}

void main(){
    // main里的全局函数
    int globalInMain(){
        return 123;
    }
    // 调用
    globalOutMain();
    globalInMain();
}

// 实例方法和类方法
class Person {
  static String className = 'Person';
  late final String name;
  
  void show() {
    print(name);
  }
  
  static void showClassName() {
    print(className);
  }
}
    // 调用
    final persion = Person();
    persion.name = 'jack';
    persion.age = 16;
    persion.show();
    Person.showClassName();
匿名函数 :

匿名函数的声明:

// 第一种声明
(param1, param2, ...) { 
  code; 
  return type;
}
// 第二种声明:声明一个匿名函数,并赋值给变量functionName
functionName(param1, param2, ...) { 
  code; 
  return type;
}
// 第二种声明等价于
var functionName = (param1, param2, ...) { 
  code; 
  return type;
};

注意点:

  • 匿名函数可以赋值给变量;
  • 其实匿名函数可以有名字的,即为赋值的变量;
  • 匿名函数通过赋值的变量进行调用,这就是所说的函数表达式;
  • 匿名函数可以自执行;
  • 匿名函数哦一些方法的回调函数,即匿名函数可以作为函数的参数。
    // 声明一个匿名函数,并赋值给变量function1
    function1(int a, int b) {
      return (a + b);
    }
    // 将匿名函数赋值给一个变量
    var fVar = function1;
    // 匿名函数调用
    print(function1(2, 3));
    print(fVar(2, 3));
    // 匿名函数自执行
    () {
      print('匿名函数自执行');
    } ();
    const list = ['apples', 'bananas', 'oranges'];
    // 匿名函数作为回调函数,即作为函数的参数
    list.forEach((item) {
      print('${list.indexOf(item)}: $item');
    });

变量作用域和变量闭包:

  Dart是一种词法作用域限定的语言,这意味着变量的范围是静态地确定的,简单地由代码的布局决定。
  闭包即匿名函数是一个函数对象,它可以访问其词法作用域内的变量,即使该函数是在其原始作用域之外使用的。

  • {}外的变量或常量可以在{}内使用;
  • {}内的变量或常量不可以在{}外使用;
bool topLevel = true;

void main() {
  var insideMain = true;

  void myFunction() {
    var insideFunction = true;

    void nestedFunction() {
      var insideNestedFunction = true;

      assert(topLevel);
      assert(insideMain);
      assert(insideFunction);
      assert(insideNestedFunction);
    }
  }
}

// 返回值是闭包函数
Function makeAdder(int addBy) {
  return (int i) => addBy + i;
}
    // 调用
    var add2 = makeAdder(2);
    var add4 = makeAdder(4);
    print(add2(1));
    print(add4(1));
函数等价判断 :

下面是一个测试顶级函数(全局函数)、静态方法和实例方法是否相等的例子:

可调用类:

  可调用类即类的实例可以像函数一样进行调用的类。怎样才能让类的实例像函数一样进行调用呢?很简单只需要在类中实现一个call()函数。如下:

class WannabeFunction {
  // String call(String a, String b, String c) => '$a $b $c!';
  // String call() => '123';
  int call(int a) => (a + 1);
}

  var wf = WannabeFunction();
  // print(wf('Hi', 'there,', 'gang'));
  // print(wf());
  print(wf(1));

相关文章

  • Dart基础(四)-函数

    简介: Dart是一种真正的面向对象语言,所以函数也是对象,并且有一个类型Function。这意味着函数可以赋值给...

  • dart基础---函数

    Dart中函数是对象其类型为Function,可以作为参数被另一个函数调用也可以作为一个变量。Dart中不支持函数...

  • Dart基础: 构造函数

    Dart基础: 构造函数 Dart的构造函数比较变化多端, 我们可以在不同的场景下合理声明和调用一个class的构...

  • Dart 基础(四)

    前言笔者在之前已经写了3篇Dart的基础文章了。Dart 基础 (一)Dart 基础 (二)Dart 基础 (三)...

  • Dart 基础 (三)

    前言笔者在之前已经写了2篇Dart的基础文章了。Dart 基础 (一)Dart 基础 (二) 本文是Dart基础的...

  • Dart 基础(四)

    级别: ★☆☆☆☆标签:「Flutter 」「Dart」「Dart class」「Dart mixin」「Dar...

  • Dart语言基础(四)之函数方法(Function)

    方法定义 方法包含:返回类型、方法名、传入参数、方法体、返回值 返回类型 方法名(参数1,参数2...) { ...

  • Dart语法(下)

    前文链接: Dart简介 Dart语法(上) 内容: 函数(方法)函数定义及各类函数;函数参数;闭包 面向对象定义...

  • Dart/Flutter基础-函数(方法)

  • Dart语法基础-3函数

    1.函数的基本定义 Dart是一种真正的面向对象语言,所以即使函数也是对象,所有也有类型, 类型就是Functio...

网友评论

      本文标题:Dart基础(四)-函数

      本文链接:https://www.haomeiwen.com/subject/hswhqrtx.html