Skip to content

1.函數的使用

main函數

任何Dart應用程序==都需要有一個main函數作為整個應用程序的入口。我們之前編寫的所有程序都有一個main函數,==main函數不一定要在程序的開頭,但是它一定會作為程序的入口,在main函數中,我們可以編寫邏輯代碼,也可以調用其他函數。
在數學中,函數代表了一種運算規則,函數有定義域、值域和映射關係3要素。在編程中,函數的概念與數學中函數的概念相差不多,也有3要素,==分別為參數、返回值和函數體。==任何一個函數都由這3部分組成,在平時編寫main函數時,我們隱藏了返回值並且忽略了參數,一個完整的main函數編寫如下:

 void main(List<String> argus) {
    print(argus);
 }

可以發現,main函數其實是一個返回值是void並且有一個字符串列表參數的函數。
返回值 函數名(參數組){
    函數體
}

自定義函數

例如下面例子

num addFunc(num a, num b){
    return a + b;
}

這是一個有兩個num類型的參數並且返回值為num類型的函數,a和b為傳遞進函數的參數名,在函數體內可以通過參數名來獲取參數的值進行使用,通過函數體的運算後,使用return語句將結果返回。在main函數中對自定義的函數體進行調用,代碼如下:
main() {
    var add = addFunc;
    var res = add(3,6);//通過變量來調用函數
    print(res);//9
    print(addFunc(1,7));//8
}

若無設定函數的屬性則會根據參數去作調整返回值
addFunc(a,b){
    return a + b;
}
main() {
    var add = addFunc;
    var res = add("3","6");//通過變量來調用函數
    print(res);//字符串 36
    print(addFunc(1,7));//8
}

也可以把函數寫成如下:
num addFunc(num a, num b)=> a + b;
"""
或者
"""
addFunc(a, b)=> a + b;

對於前面我們所編寫的函數,在調用時,其傳入的參數個數與類型必須與函數定義的一致。這種要求在實際開發中通常會稍顯嚴格,有的時候,我們編寫的函數的參數並非都是必須傳入的,Dart函數提供位置可選參數與名稱可選參數兩種方式來定義可選參數的函數。

可選參數是指在調用函數時,某個參數是可選的,即調用者可以選擇傳入此參數,也可以選擇不傳入。在Dart中,可選參數分為名稱可選參數和位置可選參數。對於名稱可選參數,函數的定義格式如下所示:

返回值類型 函數名({參數列表}){
   函數體
}

和前面我們所學習的函數唯一不同的地方在於參數列表被放入了大括號中。對於名稱可選函數,其返回值類型和參數類型也可以省略。下面是一個名稱可選參數函數的示例:
//使用函數時必須填入參數名稱及值
myFunc({String name="未知",int age=0}){
    if(name!=null){
        print("名字是:${name}");
    }
    if(age!=null){
        print("年齡是:${age}");
    }
}
main() {
    myFunc(age:26,name:"Ahwu");
    myFunc2("Ahwu");
    myFunc();//名字是:未知 年齡是:0
    myFunc2("",13);
}
//使用函數時必須在正確的參數位置放入有效參數
myFunc2([String name="Ahwu" ,int age=26]){
    print("名字是:${name}");
    print("年龄是:${age}");
}

myFunc函數中定義了兩個參數,分別表示姓名和年齡,這兩個參數都是可選的,在調用的時候,我們需要使用參數名加冒號的方式來進行參數的傳遞,參數的先後順序並不重要,並且調用者也可以選擇只傳一部分參數或者不傳參數,函數在執行時都不會產生錯誤。
Output:
名字是:Ahwu

年齡是:26

名字是:Ahwu

年龄是:26

名字是:未知

年齡是:0

名字是:

年龄是:13

函數可選參數的默認值

可選參數的函數在調用時,如果調用者沒有傳入某個參數,函數中獲取到的此參數值就為null,例如上述程式碼中在

main() {
    myFunc();//名字是:未知 年齡是:0
}

這個部分可以看到沒有指定任何參數需要設定資料值,因此他的輸入便是null,在定義可選參數函數時,我們應盡量為其提供一個默認值,默認值可以使函數的執行更加可控,程序的執行更加安全。

匿名函數

通過函數名可以進行函數的調用,然而並非所有函數都有名字,在Dart中,沒有名字的函數被稱為匿名函數匿名函數可以直接賦值給變量,通過變量來進行函數的調用,也可以通過匿名函數來創建自執行的函數,例如:

var func = (a,b){
    return a+b;
};

main() {
    var res = func(1,5);
    print(res);
    (name){//這裡就是匿名函數,他會直接賦值給變量,也就是底下("Ahwu")
        print("hello ${name}!");
    }("Ahwu");
}

作用域

所謂作用域,其實指的就是變量的有效範圍,在Dart中,大括號會生成作用域,也就是說,條件結構、循環結構、函數等都會生成作用域。在作用域內聲明或定義的變量,出了作用域就被銷毀並且無法使用,例如:

main() {
    if(true){ 
        var a = 2;
    }   
    print(a);//報錯,a在if這個條件下的作用域定義,在main底下沒有辦法取用
}


Last update : 13 novembre 2024
Created : 13 novembre 2024

Comments

Comments