1、一等方法对象
方法都是对象,可以赋值给Function 变量
/**定义一个fun 方法*/
void fun() {
}
void main() {
Function f = fun; //将fun 方法赋值给Function 变量 f ;
f(); //直接使用Function 变量 f 执行方法;
}
/**定义一个fun2 方法*/
void fun2(Function f) {}
void main() {
Function f2 = fun2;
f2();//由于调用fun2 方法时没有传入参数,所以运行时会报错 error,jpg}
因此,可以使用 typedef 关键字让编译器在编译时进行检查;
/*定义一个类型, F 类型, 这个类型其实就是一个方法, 接受两个int参数, 返回void */
typedef void F(int i, int j);
void fun3(F f) {
f(1);//由于F 方法使用 typedef 定义,在传入参数与方法参数不匹配时会在编译时报错f(1,2); //传入对应的参数则能通过编译
}
2、可选位置参数
方法参数用[ ]括起来的就叫可选位置参数,调用时可传参数,也可不传
/**定义一个可选位置参数方法*/
void fun([int i, int j] ){//用[]括起来的就叫可选位置参数,调用时可传参数,也可不传
print(i);
print(j);
}
/** main 方法*/
void main(){
fun(1);//调用 fun 方法,传递一个参数,此时输出 1,null,没有传递的参数默认为null;
fun();//调用 fun 方法,不传递参数,此时输出 null,null;
fun(2,3); //调用 fun 方法,传递对应个数的参数,此时输出 2,3;
}
注意:如果想给 j 赋值,则必须保证 i 传值,因为是可选 位置 参数
在方法命名是可指定默认值;
void fun([int i=1, int j=2] ){//用[]括起来的就叫可选位置参数,调用时若传递参数,则使用传递的参数值,反之使用默认参数值
print(i);
print(j);
}
/** main 方法*/
void main(){
fun(10);//调用 fun 方法,传递一个参数,此时输出 10,2,没有传递的参数使用默认值;
fun(); //调用 fun 方法,不传递参数,使用默认参数值,此时输出 1,2;
fun(2,3); //调用 fun 方法,传递对应个数的参数,此时输出 2,3;
}
3、可选命名参数
方法参数用{ }括起来的就是可选命名参数,调用时可传参数,也可不传,
可选命名参数方法传参是不能像可选位置参数方法一样直接传值,需指定给谁传值
/*定义一个可选命名参数方法,使用{ } */
void fun({int i,int j }){
}
/** main 方法*/
void main(){
fun(1,2);//可选命名传参是不能像可选位置参数方法一样直接传值,需指定给谁传值,此处语法错误fun(i:100);//指定给i传值为100
fun(j:200);//指定给j传值为200
fun(i:100,j :200);//分别给i和j 传值
fun();//不传值
}
可选位置参数方法不能直接给后面的参数传值,可选命名参数可以给后面的参数传值,两者都可以设置默认值 ;
不需要像Java一样写一大堆的重载方法;
4、默认参数值
在定义方法是为方法内部参数提供对应参数的值,也就是为参数设置默认值的方式;
void fun([int i=1, int j=2] ){//方法在初始话时就给参数赋值
print(i);
print(j);
}
void fun({ int i=1, int j=2 } ){//方法在初始话时就给参数赋值
print(i);
print(j);
}
5、匿名方法
方法内可传入匿名方法,lambda 表达式,closure 闭包
void fun2(int k,int z){
print("cx");
}
Function f = fun2;
f((int i, int j){ //方法内传入一个没有方法名的方法
return 1;
});