Dart語言基礎(四)之函數(shù)方法(Function)

方法定義

  • 方法包含:返回類型、方法名、傳入?yún)?shù)、方法體、返回值

      返回類型 方法名(參數(shù)1,參數(shù)2...) {
          
          方法體...
          return 返回值
      }
    

方法特性

  • 方法也是對象,并且有具體類型的Function

  • 方法沒有返回值。如果沒有指定,默認return null

  • main方法,沒有返回值一個參數(shù)

      void main(List<String> args) {
          print(args); //[]
      }
    
  • 有返回值、多個參數(shù)

      String getStudent(String name, int age) {
    
          return 'name=$name,age=$age';
      }
      
      void main(List<String> args) {
          
          String stu = getStudent('張三',30);
          print(stu);//name=張三,age=30
      } 
    
  • 返回類型、參數(shù)類型都可以省略

      getStudent(name,age) {
          return ('name=$name,age=$age');
      }
      void main() {
    
          String stu = getStudent('張三',30);
          print(stu);//name=張三,age=30
      } 
    
  • 箭頭語法:=>expr是{return expr;}縮寫。只是用一個表達式

      //返回類型string 簡寫 
      getPerson(name,age) =>'name=$name, age=$age';
      
      void main() {
          
          print(getPerson('李四', 30));;//name=李四,age=30
      } 
    

可選參數(shù)

  • 可選命名參數(shù):{param1,param2}

  • 可選命名參數(shù)可以不傳值

      //可選命名參數(shù),后面兩個參數(shù)可以不傳
      printOptionParams(String name,{int age, String gender}) {
          print('name=$name,age=$age,gender=$gender');
       }
      
      void main() {
                  
          printOptionParams('王五'); //name=王五,age=null,gender=null 
          
          //可選參數(shù)的條用param:value
          printOptionParams('王五',age: 20); //name=王五,age=20,gender=null
          
          printOptionParams('王五',age: 20,gender: '男'); //name=王五,age=20,gender=男
          
          printOptionParams('王五',gender: '男',age: 20); //name=王五,age=20,gender=男
      } 
    
  • 可選位置參數(shù):[param1,param2]

  • 可選位置參數(shù)可以不傳,但是參數(shù)的位置不能變

//可選位置參數(shù),后面兩個參數(shù)可以不傳 age gender位置不能互換
 printOptionParams(String name,[int age, String gender]) {

        print('name=$name,age=$age,gender=$gender');
    }   
 
 void main(List<String> args) {
            
        printOptionParams('王五'); //name=王五,age=null,gender=null 
        
        //可選參數(shù)的條用param:value
        printOptionParams('王五',20); //name=王五,age=20,gender=null
        
        printOptionParams('王五',20,'男'); //name=王五,age=20,gender=男
        
        //必須按照位置來傳參數(shù),int String不能調(diào)用位置
        printOptionParams('王五','男', 20); //報錯
}
  • 如果存在具體參數(shù),可選參數(shù)必選在具體參數(shù)的后面

      //可選位置參數(shù)在具體參數(shù)前面
      printOptionParams([int age, String gender],String name) {
          
          print('name=$name,age=$age,gender=$gender');
      } //方法調(diào)用的時候會報錯
      //可選命名參數(shù)在具體參數(shù)前面 
      printOptionParams({int age, String gender},String name]) {
          
          print('name=$name,age=$age,gender=$gender');
      } //方法調(diào)用的時候會報錯
    

默認參數(shù)

  • 使用 = 在可選參數(shù)指定默認值

  • 默認值只能是編譯器的常量

  • 默認參數(shù),方法調(diào)用沒給可選參數(shù)賦值話,賦值默認值

      printOptionParams(String name,{int age=30, String gender='女'}) {
          print('name=$name,age=$age,gender=$gender');
       }
      
      void main() {
                  
          printOptionParams('王五'); //name=王五,age=30,gender=女 
          
          //可選參數(shù)的條用param:value
          printOptionParams('王五',age: 20); //name=王五,age=20,gender=女
          
          printOptionParams('王五',age: 20,gender: '男'); //name=王五,age=20,gender=男
          
          printOptionParams('王五',gender: '男',age: 20); //name=王五,age=20,gender=男
      } 
      
      //默認參數(shù),方法調(diào)用沒給位置參數(shù)賦值話,賦值默認值
      printOptionParams(String name,[int age=30, String gender = '女']) {
          print('name=$name,age=$age,gender=$gender');
       }
      
      void main() {
                  
          printOptionParams('王五'); //name=王五,age=30,gender=女 
          
          //位置參數(shù)賦值的順序不能變
          printOptionParams('王五', 20); //name=王五,age=20,gender=女
          
          printOptionParams('王五', 20, '男'); //name=王五,age=20,gender=男
      } 
    

方法對象

  • 方法可作為對象賦值給其他變量

      void printHello() {
          print('hello');
      }
      
      void main() {
          var func = printHello;
          //也可以用Function 來聲明
          //Function func = printHello;
          func(); //hello
      }
    
  • 方法可作為參數(shù)傳遞給其他方法

      // times方法
      String times(str) {
          return str*3;
      }
      
      //把times方法當做參數(shù),返回的也是一個
      List listTimes (List list, String times(str)) {
          for (var i = 0; i < list.length; i++) {
              
              list[i] = times(list[i]);
              print(list[i]);
          }
      }
    
      void main() {
          
          var list = ['h','i'];
          //方法作為參數(shù)時候不應該有()
          listTimes(list,times); 
          /*
              hhh
              iii
          */
      }
    

匿名方法

  • 匿名方法定義

      (參數(shù)1,參數(shù)2) {
          
          方法體...
          return 返回值
      }
    
  • 可賦值給變量,通過變量進行調(diào)節(jié)

  • 匿名方法不能放在外面單獨聲明,要是方法內(nèi)聲明

      var fuc = (str) {
          print(str);
      };
      fuc(30); 
    
  • 可在其他方法中直接調(diào)用或者傳遞給其他方法

      List listTimes (List list, String times(str)) {
          for (var i = 0; i < list.length; i++) {
              list[i] = times(list[i]);
              print(list[i]);
          }
      }
    
      void main() {
          
          var list = ['h','i'];
          //方法作為參數(shù)時候不應該有()
          listTimes(list,(str){return str*3}); 
          /*
              hhh
              iii
          */
      }
    

閉包

  • 閉包是一個方法也是對象(dart中一切都是對象)
  • 閉包定義在其他方法內(nèi)部
  • 閉包能夠訪問外部方法內(nèi)的局部變量,并持有其狀態(tài)(這是閉包最大的作用,可以通過閉包的方式,將其暴露出去,提供給外部訪問)
        void main() {
            //func持有count的狀態(tài)
            var func = a();
            //每次調(diào)用count并沒有每次初始化為0
           //從打印結果來看,func持有count的狀態(tài)
          //我們無法直接通過操作count來改變,可以通過閉包的方式,將其暴露出去,使得外部可以訪問
            func(); //1
            func(); //2
            func(); //3
        }

        // 聲明一個無返回值類型、無參數(shù)的函數(shù)
        a() { 
            //count是a的局部變量
            int count = 0;
          // 內(nèi)部聲明一個函數(shù) : 閉包
            printCount()  {
            // 內(nèi)部可以訪問外部方法內(nèi)的局部變量 count
                count += 1;
                print(count);
            }
              // 返回閉包
            return printCount;
        }

閉包的要素:

  • 首先聲明一個無返回值、無參數(shù)的函數(shù)

  • 其次在函數(shù)內(nèi)有局部變量

  • 然后在聲明一個閉包函數(shù),閉包函數(shù)調(diào)用局部變量并且持有局部變量的狀態(tài)

  • 返回閉包

結尾

[下一篇講述Dart語言基礎(五)之面向?qū)ο蠡A特性](http://www.itdecent.cn/p/c3b801de7584

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容