Dart 语言入门扫盲篇之2:【函数】

470 阅读2分钟

【函数】

关键词:可选位置参数[]、可选命名参数{}、参数默认值、函数返回值、匿名函数、闭包、扩展方法

·可选位置参数[]: 用[]标记包装函数参数,放在参数列表的后面
///·可选位置参数[]: 用[]标记包装函数参数,放在参数列表的后面
String say(String who, String something, [String experession]) {
  var result = '$who 说 $something';
  if (experession != null) {
    result = '$result ;带着 $experession 的表情';
  }
  return result;
}

使用:
  //不带可选参数调用:
  var result = say('小明', '捡到钱' );
  print('可选位置参数[] 输出:$result');
  //带可选参数调用:
  var result1 = say('小明', '捡到钱', '高兴');
  print('可选位置参数[] 输出:$result1');
·可选命名参数{}:用{}标记包装函数参数,放在参数列表的后面,用于指定命名参数
///·可选命名参数{}:用{}标记包装函数参数,放在参数列表的后面,用于指定命名参数
String say1(String who, String something, {String experession, bool hidden, 
  int add}) {
  var result = '$who 说 $something';
  if (experession != null) {
    result = '$result ;带着 $experession 的表情';
  }
  if (hidden != null) {
    result = '$result 附带 $hidden';
  }
  if (add != null) {
    result = '$result 附带 $add';
  }
  return result;
}
使用:
  //可选命名参数{}:
  var result2 =
      say1('小明', '捡到钱', experession: '高兴', hidden: false, add: 1);
  print('可选命名参数{} 输出:$result2');

  注意:
     如果可选命名参数{}方式,但某个参数一定要传时,用 @required 来标识

String say({@required String who, @required String something, String experession, bool hidden, int add}) {}
使用:
  // @required 使用
  say2(from: null, msg: null);
·默认参数:(使用等号(=)来设置默位置字参数)
String say(String who,  String something, {String experession = '高兴', bool hidden = false, int add}) {}
·函数返回值
所有的函数都会有返回值,没有指定则默认返回null, 没有显示return,会隐式添加return语句;

  注意:函数返回值是没有类型推断的,so,指定返回值必须指定具体的类型哦

·高阶函数: 函数作为参数传递,能接受函数值作为参数的函数即为高阶函数。
Function add6 = (int a, int b) => a+b;
int operator(Function op_fun, int a, int b)
{
    return op_fun(a, b);
}

void main() {
    ///高阶函数
    var result = operator(add6, 1, 2);
    print('高阶函数输出:$result'); //输出结果:3
}
·匿名函数
Function add6 = (int a, int b) => a+b;
print(add6(1,2)); // 3
·闭包 Closure
简单来说是 A函数内定义了B函数,而B函数又引用了A函数的变量和参数,B 函数被直接返回或间接执行。

形成闭包的关键是:内部参数被一直持有
fun A(int a, int b) {
    var sum = fun () {
        return a + b;
    }
    return sum;
}

void main() {
     var f1 = A(1, 2); //只定义f1,并传参,但不会得到结果
    print('闭包输出:${f1()}'); // 执行f1()才会得到结果, 输出结果:4
    print('闭包输出:${f1()}'); // 执行f1()才会得到结果,输出结果:5
    print('闭包输出:${f1()}'); // 执行f1()才会得到结果,输出结果:6
}

  注意: 每次调用都会返回一个新的函数,即使传入相同的参数

·扩展方法: extension-on
//通过关键词 extension 给 String 类添加新方法
extension NumberParsing on String {
  int parseInt() {
    return int.parse(this);
  }
}
使用时:
print('42'.parseInt());

  注意:当拓展方法与父类中存在的方法名一致时,拓展方法无效,运行时只会调用父类的方法,不会调用你的拓展方法