【函数】
关键词:可选位置参数[]、可选命名参数{}、参数默认值、函数返回值、匿名函数、闭包、扩展方法
·可选位置参数[]: 用[]标记包装函数参数,放在参数列表的后面
///·可选位置参数[]: 用[]标记包装函数参数,放在参数列表的后面
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());
注意:当拓展方法与父类中存在的方法名一致时,拓展方法无效,运行时只会调用父类的方法,不会调用你的拓展方法