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

方法定义

  • 方法包含:返回类型、方法名、传入参数、方法体、返回值

      返回类型 方法名(参数1,参数2...) {
          
          方法体...
          return 返回值
      }
    

方法特性

  • 方法也是对象,并且有具体类型的Function

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

  • main方法,没有返回值一个参数

      void main(List<String> args) {
          print(args); //[]
      }
    
  • 有返回值、多个参数

      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
      } 
    
  • 返回类型、参数类型都可以省略

      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
      } 
    

可选参数

  • 可选命名参数:{param1,param2}

  • 可选命名参数可以不传值

      //可选命名参数,后面两个参数可以不传
      printOptionParams(String name,{int age, String gender}) {
          print('name=$name,age=$age,gender=$gender');
       }
      
      void main() {
                  
          printOptionParams('王五'); //name=王五,age=null,gender=null 
          
          //可选参数的条用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=男
      } 
    
  • 可选位置参数:[param1,param2]

  • 可选位置参数可以不传,但是参数的位置不能变

//可选位置参数,后面两个参数可以不传 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 
        
        //可选参数的条用param:value
        printOptionParams('王五',20); //name=王五,age=20,gender=null
        
        printOptionParams('王五',20,'男'); //name=王五,age=20,gender=男
        
        //必须按照位置来传参数,int String不能调用位置
        printOptionParams('王五','男', 20); //报错
}
  • 如果存在具体参数,可选参数必选在具体参数的后面

      //可选位置参数在具体参数前面
      printOptionParams([int age, String gender],String name) {
          
          print('name=$name,age=$age,gender=$gender');
      } //方法调用的时候会报错
      //可选命名参数在具体参数前面 
      printOptionParams({int age, String gender},String name]) {
          
          print('name=$name,age=$age,gender=$gender');
      } //方法调用的时候会报错
    

默认参数

  • 使用 = 在可选参数指定默认值

  • 默认值只能是编译器的常量

  • 默认参数,方法调用没给可选参数赋值话,赋值默认值

      printOptionParams(String name,{int age=30, String gender='女'}) {
          print('name=$name,age=$age,gender=$gender');
       }
      
      void main() {
                  
          printOptionParams('王五'); //name=王五,age=30,gender=女 
          
          //可选参数的条用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=男
      } 
      
      //默认参数,方法调用没给位置参数赋值话,赋值默认值
      printOptionParams(String name,[int age=30, String gender = '女']) {
          print('name=$name,age=$age,gender=$gender');
       }
      
      void main() {
                  
          printOptionParams('王五'); //name=王五,age=30,gender=女 
          
          //位置参数赋值的顺序不能变
          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
      }
    
  • 方法可作为参数传递给其他方法

      // times方法
      String times(str) {
          return str*3;
      }
      
      //把times方法当做参数,返回的也是一个
      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'];
          //方法作为参数时候不应该有()
          listTimes(list,times); 
          /*
              hhh
              iii
          */
      }
    

匿名方法

  • 匿名方法定义

      (参数1,参数2) {
          
          方法体...
          return 返回值
      }
    
  • 可赋值给变量,通过变量进行调节

  • 匿名方法不能放在外面单独声明,要是方法内声明

      var fuc = (str) {
          print(str);
      };
      fuc(30); 
    
  • 可在其他方法中直接调用或者传递给其他方法

      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'];
          //方法作为参数时候不应该有()
          listTimes(list,(str){return str*3}); 
          /*
              hhh
              iii
          */
      }
    

闭包

  • 闭包是一个方法也是对象(dart中一切都是对象)
  • 闭包定义在其他方法内部
  • 闭包能够访问外部方法内的局部变量,并持有其状态(这是闭包最大的作用,可以通过闭包的方式,将其暴露出去,提供给外部访问)
        void main() {
            //func持有count的状态
            var func = a();
            //每次调用count并没有每次初始化为0
           //从打印结果来看,func持有count的状态
          //我们无法直接通过操作count来改变,可以通过闭包的方式,将其暴露出去,使得外部可以访问
            func(); //1
            func(); //2
            func(); //3
        }

        // 声明一个无返回值类型、无参数的函数
        a() { 
            //count是a的局部变量
            int count = 0;
          // 内部声明一个函数 : 闭包
            printCount()  {
            // 内部可以访问外部方法内的局部变量 count
                count += 1;
                print(count);
            }
              // 返回闭包
            return printCount;
        }

闭包的要素:

  • 首先声明一个无返回值、无参数的函数

  • 其次在函数内有局部变量

  • 然后在声明一个闭包函数,闭包函数调用局部变量并且持有局部变量的状态

  • 返回闭包

结尾

[下一篇讲述Dart语言基础(五)之面向对象基础特性](https://www.jianshu.com/p/c3b801de7584

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容