dart 02函数

函数

  • Dart 是一门真正面向对象的语言, 甚至其中的函数也是对象,并且有它的类型 Funcation
  • 这也意味着函数可以被赋值给变量或者作为参数传递给其他函数。 也可以把 Dart 类的实例当做方法来调用

main() 函数

任何应用都必须有一个顶级 main() 函数,作为应用服务的入口。 main() 函数返回值为空,参数为一个可选的 List<String>

函数声明

  • bool  isNoble(int number){a
    	// 函数体	
        return number>0;
    }
    // bool返回值 当返回值为空可以写void 或者省略不写 若不为空则需要指定返回类型 比如int string bool等 
    //isNoble 函数名称
    //int 参数类型
    //number 参数 
    
  • 函数简写

    • 如果函数中只有一句表达式,可以使用简写语法:

      • bool isNoble(int number) =>number > 0;
        
      • => *expr* 语法是 { return *expr*; } 的简写。 => 符号 有时也被称为 箭头 语法

    • 在箭头 (=>) 和分号 (😉 之间只能使用一个 表达式 ,不能是 语句 。 例如:不能使用 if 语句 ,但是可以是用 条件表达式.

函数参数

dart 除了普通的参数之外还支持可选参数 以及设置可选参数默认值

dart 参数如果不指定参数类型 示例test(param)那么param将是dynamic类型

可选参数

可选参数可以是命名参数或者位置参数,但一个参数只能选择其中一种方式修饰

命名可选参数

  • 可选的命名参数调用函数时可以指定命名参数

  • 与顺序无关 在调用函数的时候需要指明参数名 例如paramName:value

  • 定义函数参数时用{}包裹 例如{param1,param2...}

  • 可以指定参数类型 也可以不指定类型 例如{params,int param1}

  • 默认值旧版本用: 新版本支持= 推荐使用= 没有赋值 值为null 例如:{param1="nike",int param2}

  • @required 修饰的参数为必传参数

  • 示例

    • void enableFlags({bool param1, String param2 = '2', @required param3}) {
        if (param1) {
          print(param2 + param3.toString());
        }
      }
      
  • 调用

    • /*可选命名参数*/
        enableFlags(param1: true, param3: 3);
        enableFlags(param1: true, param2: 'test', param3: 3);
      

位置可选参数

  • 参数值依次赋值 与顺序有关

  • 定义函数参数时用[]包裹

  • 同样可以指定参数类型也可以不指定参数类型

  • 默认值用=没有赋值 值为null

  • 示例

    • void enableFlags2(bool param1, [String param2 = 'Test2', param3, param4]) {
        if (param1 is bool) {
          print(param2 + param3.toString() + param4.toString());
        }
      }
      
  • 调用

    • /*可选的位置参数*/
      enableFlags2(true, 'new', 3);
      enableFlags2(true, 'new', 3, 4);
      
参数默认值
  • 默认值用=没有赋值 值为null 上面解释有

可选参数示例

可传递List map 作为可选参数
const 表示编译时常量 故名思意 只有编译前可以改变值 编译后无法改变

  • 函数

    • void doStuff(
          {List<int> list = const [1, 2, 3],
          Map<String, String> gifts = const {
            'first': 'paper',
            'secend': 'cotton',
            'third': 'leather'
          }}) {
        print('list: $list');
        print('gifts:$gifts');
      }
      
  • 调用方式

    • /*可传递List map*/
        List<int> list = [4, 5, 6];
        Map<String, String> map = {
          'one': 'param1',
          'two': 'param2',
          'three': 'param3'
        };
        doStuff(list: list, gifts: map);
      

函数一等公民

  • 函数也是对象 可以赋值给变量

    • var sayHelloN = (name) => 'hello $name';// 后面函数就是匿名函数
      
  • 可以将函数作为别的函数的参数

    • void printElement(int element) {
        print(element);
      }
      var listN = ['apples', 'banners', 'orange'];
      listN.forEach(printElement(element));
      

匿名函数

没有名字的函数就称为匿名函数,有时候也被称为 lambda 或者 closure

  • 匿名函数可以赋值到一个变量中

    • var sayHelloN = (name) => 'hello $name';// 后面函数就是匿名函数
      
  • 函数定义

    • 匿名函数和命名函数看起来类似— 在括号之间可以定义一些参数或可选参数,参数使用逗号分割。

    • //后面大括号中的代码为函数体:
      
      ([[Type] param1[, …]]) {
        codeBlock;
      };
      
  • 示例 定义一个五类型参数item的匿名函数,list每个元素调用该函数 打印元素位置和字符串

    • var listN = ['apples', 'banners', 'orange'];
        listN.forEach((item) {
          print('${listN.indexOf(item)}:$item');
        });
        listN.forEach((item) => print('${listN.indexOf(item)}:$item')); //用=>写
      

函数闭包

  • 闭包 即一个函数对象。即使函数对象的调用在它原始作用域之外, 依然能够访问在它词法作用域内的变量。

  • 函数可以风i定义到它作用域内的变量

    • 示例

    • makeAdder() 捕获了变量 addBy。 无论在什么时候执行返回函数,函数都会使用捕获的 addBy 变量。

      • /// 返回一个函数,返回的函数参数与 [addBy] 相加。
        Function makeAdder(num addBy) {
          return (num i) => addBy + i;
        }
        
        void main() {
          // 创建一个加 2 的函数。
          var add2 = makeAdder(2);
        
          // 创建一个加 4 的函数。
          var add4 = makeAdder(4);
        
          assert(add2(3) == 5);
          assert(add4(3) == 7);
        }
        

函数返回值

所有函数都会返回一个值。 如果没有明确指定返回值, 函数体会被隐式的添加 return null; 语句。

foo() {}

assert(foo() == null);

测试函数是否相等

//测试函数是否相等
//下面是顶级函数,静态方法和示例方法相等性的测试示//例:

void foo() {} // 顶级函数

class A {
  static void bar() {} // 静态方法
  void baz() {} // 示例方法
}

void main() {
  var x;

  // 比较顶级函数。
  x = foo;
  assert(foo == x);

  // 比较静态方法。
  x = A.bar;
  assert(A.bar == x);

  // 比较实例方法。
  var v = A(); // A的1号实例
  var w = A(); // A的2号实例
  var y = w;
  x = w.baz;

  // 两个闭包引用的同一实例(2号),
  // 所以它们相等。
  assert(y.baz == x);

  // 两个闭包引用的非同一个实例,
  // 所以它们不相等。
  assert(v.baz != w.baz);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章