1. 程式人生 > >Dart2基礎(六)

Dart2基礎(六)

目錄

基本定義

可選引數

引數預設值 

匿名函式

作用域

閉包

Dart2是純面相物件的語言,所以函式也是一個物件。

函式也可以作為引數,傳入其他的函式中。

所有函式都有返回值,如果沒有指定返回值,則返回null。

  • 基本定義

函式的定義很簡單,下面是一些簡單的例子。

// 定義一個不帶返回值的函式,可以帶void, 也可以不帶
void say(var word){
    print("I say '${word}'";
}

// 引數可以不用指定型別,如果不指定,則預設是var
bool isInt(numVar){
    return numVar is int;
}

// 如果函式只有一個return 語句可以用 => 簡寫
// 需要注意 => 後面只能是一個表示式或者是單條語句。
bool isInt2(numVar) => numVar is int;

main(){
   say('hello world'); // I say 'hello world'
   print(isInt('a')); // false
   print(isInt(1)); // true
}
  • 可選引數

函式允許定義可選的引數。

定義可選引數有兩種方式一種使用{}, 另一種使用[]。區別就是, 如果用{}宣告,在使用時必須帶著引數名,如:a:123;如果用[]宣告,在使用時需要按照順序使用。

void travel({String from, String to}){
    print("From ${from} to ${to}");
}

void travel2(String from, [String to, String city]){
    print("From ${from} to ${to} and ${city};
}

main(){
    travel(); // From null to null
    // 必須傳入的是哪個引數的值
    travel(to:"usa"); // From null to usa;
    travel(from:"china", to:"usa") // From china to usa;
    travel2("china"); // From china to null and null;
    // 按照順序傳入引數值
    travel2("china", "usa"); // From china to usa and null;
    travel2("china", "usa", "england"); // From china to usa and england;
}

可選的引數,也是可以用@required指定可選的引數變成比填。要使用@required需要引入包 package:meta/meta.dart,如果是用flutter,則可以引入包package:flutter/material.dart。

void travel({@required String from , String to}){}
  • 引數預設值 

函式的引數可以用=來定義預設值,如果沒有用=賦予預設值,那麼引數預設值為null。

引數的預設值必須是編譯時常量。

ps: 您可能見過用:來賦予引數預設值,這是老程式碼的使用方式,但是這個將在後續版本中去掉,所以最好還是用=。

void travel({String from="china", String to="usa"}){
  print("From ${from} to ${to}");
}

// list和map的預設值需要用const修飾
void animals([List<String> names= const ["cat", "dog"], Map<String, String> nameMap = const{
  "c": "cat", 
  "d": "dog"
}]){
  print("animals: ${names}");
  print("nameMap: ${nameMap}");
}

main(){
    travel(); // From china to usa;
    travel(from:"japan"); // From japan to usa;
    animals(); // animals:['cat', 'dog'] nameMap: {'c', 'cat', 'd': 'dog'}
}
  • 匿名函式

匿名函式的定義

([[Typeparam1[, …]]) {    codeBlock;  }; 

main(List<String> args) {
  var listVar = ["cat", 'dog'];
  listVar.forEach((animal){
    print("animal is ${animal}");
  });
  // 如果只有一行程式碼,可以使用=>
  listVar.forEach((animal) => print("animal is ${animal}"));
}
  • 作用域

Dart2語言的變數是有作用域的,變數的作用域是由程式碼佈局決定的。下面是一個簡單的例子。

var level1 = "level1";
main(List<String> args) {
  var level2 = "level2";
  // 定義一個內部函式
  void testScope(){
    var level3 = "level3";
    print(level1); // level1
    print(level2); // level2
    print(level3); // level3
  }
  // 執行內部函式
  testScope(); 
}
  • 閉包

閉包是一個函式物件,可以讀取其他作用域內的變數使用。

使用匿名函式可以輕鬆實現一個閉包。

// 本例項來自於官網
Function makeAdder(num){
  return (addNum){
    return addNum + num;
  };
}
main(){
  var add5 = makeAdder(5);
  var add10 = makeAdder(10);

  print(add5(1)); // 6
  print(add10(1)); // 11
}
  • main函式

main函式是應用的入口。每一個應用都必須有一個Main函式作為入口。main函式沒有返回值,並且有一個 List<String>型別的變數。

main(List<String> args) {
  print(args)
}

// 執行命令  dart test.dart hello world
// 結果: [hello, world]