美文网首页Dart
Dart语言基础(四)之函数方法(Function)

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

作者: 枫叶无处漂泊 | 来源:发表于2019-03-20 21:04 被阅读0次

    方法定义

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

        返回类型 方法名(参数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

    相关文章

      网友评论

        本文标题:Dart语言基础(四)之函数方法(Function)

        本文链接:https://www.haomeiwen.com/subject/pbwnmqtx.html