淘先锋技术网

首页 1 2 3 4 5 6 7

0 说明

该系列教程主要是为有一定语言基础 C/C++的程序员,快速学习一门新语言所采用的方法,属于在C/C++基础上扩展新语言的模式。

1 运算符(??= 运算符 和 ??运算符支持)

运算符部分基本和C/C++一致,包括关系运算符、逻辑运算符号、条件表达式等。因此这里主要关注不一样的地方即??= 运算符 和 ??运算符。它们表示 如果变量之前初始化过则使用原来的值,如果未初始化过则使用该值,测试代码如下:

void main() {
  //--------??=--------------
  //初始化过
  var a = 198;
  a ??= 201;
  print(a);

  //未初始化过
  var b;
  b ??= 202;
  print(b);

  //--------??--------------
  //未初始化过
  var c;
  var d = c ?? 10;
  print(d); // 输出10

  //初始化过
  var e = 20;
  var f = e ?? 10;
  print(f); // 输出20
}

运行结果如下所示:

[Running] dart "/data/AGS/Dart/Project/hello.dart"
hello.dart:5:3: Warning: Operand of null-aware operation '??=' has type 'int' which excludes null.
  a ??= 201;
  ^
hello.dart:21:11: Warning: Operand of null-aware operation '??' has type 'int' which excludes null.
  var f = e ?? 10;
          ^
198
202
10
20
[Done] exited with code=0 in 0.284 seconds

2 函数

函数实现方面在C语言基础上扩充了不少东西,宗旨就是为了方便好用。函数中定义函数、箭头函数、匿名函数、自执行方法、闭包等,这里逐一说明。

2.1 函数中的函数

在Dart语言中,可以将函数定义在函数中,不再像C/C++那样,只能在函数外定义函数,这一点更加灵活一些,代码如下所示:

void main() {
  //主函数中定义函数f1
  String f1(int i) {
    print("f1:$i");
    //函数f1中定义函数f2
    String f2(String str) {
      return "f2:$str";
    }

    return "f1" + f2("test");
  }

  //输出结果
  print(f1(6));
}

运行效果如下:

[Running] dart "/data/AGS/Dart/Project/hello.dart"
f1:6
f1f2:test
[Done] exited with code=0 in 0.269 seconds

2.2 箭头函数

箭头函数中,=>用于分离函数声明和函数体。相关代码如下所示:

void main() {
  // 普通函数写法
  void printInt1(int i) {
    print(i);
  }

  // 箭头函数写法
  void printInt2(int i) => print(i);

  printInt1(1);
  printInt2(2);

  print("--------------------------");

  List list = [2, 4, 6, 8, 10];

  //普通写法
  var newList = list.map((e) {
    return e > 5 ? 5 : e;
  });
  print(newList.toList());

  //箭头函数写法
  var newList1 = list.map((e) => e > 5 ? 5 : e);
  print(newList1.toList());
}

运行效果如下:

[Running] dart "/data/AGS/Dart/Project/hello.dart"
1
2
--------------------------
[2, 4, 5, 5, 5]
[2, 4, 5, 5, 5]
[Done] exited with code=0 in 0.273 seconds

2.3 匿名函数

匿名方法一般用于变量赋值和参数传递,代码如下所示:

void main() {
  //匿名方法 变量声明
  var f = (int i) {
    //定义了一个变量f(),后面是匿名方法,可以传递参数,也可以没有参数
    print("匿名方法$i");
  };
  f(5);

  String getInfo(f2(int i)) {
    return f2(6);
  }

  //打印:匿名函数传递参数
  print(getInfo((int i) {
    return "f3=$i";
  }));
}

运行效果如下:

[Running] dart "/data/AGS/Dart/Project/hello.dart"
匿名方法5
f3=6
[Done] exited with code=0 in 0.282 seconds

2.4 自执行方法

即指不需主动调用,程序启动时会自动执行该段代码,代码如下所示:

void main() {
  print("1");
  //自执行代码 开始
  (() {
    print("自执行代码");
  })();
  //自执行代码 结束
  print("2");
}

运行效果如下:

[Running] dart "/data/AGS/Dart/Project/hello.dart"
1
自执行代码
2
[Done] exited with code=0 in 0.952 seconds

注意:自执行代码只是 执行到对应位置会自动执行,并不是程序最开始时立刻执行。

2.5 函数传参

Dart语言中函数参数这里用[ ]包含的参数为可选参数,可以传递,也可以不传递,可以赋值默认值,也可以不赋值,同时还可以将函数本身作为参数传递,相关代码如下所示:

void main() {
  //参数可选
  String getInfo(String name, [int? age, String? sex]) {
    return "name:$name;age:$age;sex:$sex";
  }

  //参数可选,且有默认值
  String getInfo2(String name, [int? age = 10, String? sex = "female"]) {
    return "name:$name;age:$age;sex:$sex";
  }

  String getInfo3() {
    return "name:zhangsan;age:18";
  }

  //函数方法可以作为参数被传递
  String method1(f()) {
    return f();
  }

  print(getInfo("name")); // 输出name:name;age:null;sex:null
  print(getInfo("name", 8)); //输出name:name;age:8;sex:null
  print("------------------------------------------");
  print(getInfo2("name")); // 输出name:name;age:null;sex:null
  print(getInfo2("name", 8)); //输出name:name;age:8;sex:null
  print("------------------------------------------");
  print(method1(getInfo3));
}

运行效果如下:

[Running] dart "/data/AGS/Dart/Project/hello.dart"
name:name;age:null;sex:null
name:name;age:8;sex:null
------------------------------------------
name:name;age:10;sex:female
name:name;age:8;sex:female
------------------------------------------
name:zhangsan;age:18

[Done] exited with code=0 in 0.297 seconds

2.6 闭包

闭包概念:对于全局变量常驻内存且全局均受影响,对于局部变量又无法做到常驻内存,我们需要一种常驻内存又不影响全局的模式,因此就有了闭包,代码实现如下:

void main() {
  //闭包

  f() {
    int count = 0;
    void printf() {
      count++;
      print(count);
    }

    //特别注意 这里的写法:直接返回函数,不带括号
    return printf;
  }

  var a = f();
  a();
  a();
  a();
}

运行结果如下所示:

[Running] dart "/data/AGS/Dart/Project/hello.dart"
1
2
3
[Done] exited with code=0 in 0.278 seconds

2.7 typedef关键字

typedef 在C/C++中主要为现有类型创建别名,定义易于记忆的类型名typedef 还可以掩饰复合类型,如指针和数组,比如:

typedef int size;
size array[4];//此时size相当于int
typedef int *(*pFun)(int, char*); //此时定义了一个函数指针,类型就是包含参数为(int, char*),返回值为int *的函数。

在Dart语言中 typedef的用法是类似的,相关代码实现如下:

typedef void Operate(int num1, int num2);
void main() {
  Addition(int num1, int num2) {
    print("Addition: ${(num1)} + ${(num2)} = ${(num1 + num2)}");
  }

  Subtraction(int num1, int num2) {
    print("Subtraction: ${(num1)} - ${(num2)} = ${(num1 - num2)}");
  }

  Operate op;
  op = Addition;
  op(3, 5); //8
  op = Subtraction;
  op(5, 3); //2
}

运行结果如下所示:

[Running] dart "/data/AGS/Dart/Project/hello.dart"
Addition: 3 + 5 = 8
Subtraction: 5 - 3 = 2
[Done] exited with code=0 in 0.278 seconds

3 顺序、选择、循环基本语句(switch case字符串支持)

关于顺序、选择循环语句这些与C/C++基本一致。这里主要看不一样地方。条件表达式中switch case支持字符串选项。使用代码描述,如下所示:

void main() {
  var sex = "male";
  switch(sex){
    case "male" :
      print("male");
      break;
    case "female":
      print("female");
      break;
    default:
      print("param error");
      break; 
  }
}

运行结果如下所示:

[Running] dart "/data/AGS/Dart/Project/hello.dart"
male
[Done] exited with code=0 in 0.301 seconds