本节主要记录Dart
方法中的
- 普通方法
- 一等方法
普通方法
普通方法在用法上和java
类似。
int plus(int i, int j, int k) {
return i + j + k;
}
void main() {
print(plus(2, 3, 4));
}
支持忽略类型写法(但基于可读性等因素,还是尽量不要这么写)
plus1( i, j) {
return i + j;
}
如果只有一个表达式的方法,可以使用以下写法:
plus2(i, j, k) => i + j + k;
注:Dart
中不支持方法重载
一等方法
在Dart语法中,方法也是对象,并且具有一种类型 Function
。(这表示方法可以作为变量
甚至其他方法的参数
,即可以把方法作为参数供其他方法调用。)
abstract class Function {
external static apply(Function function, List positionalArguments,
[Map<Symbol, dynamic> namedArguments]);
int get hashCode;
bool operator ==(Object other);
}
- 如下列代码,
f1
运行结果为方法f
的执行结果,即输出function
void f() {
print("function");
}
void f1(Function function) {
function();
}
void main() {
Function function = f;
f1(function);
}
但这种写法在调用时,存在无法确定回调函数返回值和参数类型个数问题
如下列代码,方法f1
在调用f2
的时候,不能确定f2
的参数类型个数及返回类型
void f1(Function function) {
function();
}
void f2(int i, int j) {
print(i + j);
}
void main() {
Function function2 = f2;
f1(function2);
}
运行时报错如下
参数不匹配错误.png
- 针对以上情况,可以使用关键字
typedef
定义一个类型F
,该类型其实是个方法,需要传入两个int
类型参数i
和j
,返回void
typedef void F(int i, int j);
void f2(int i, int j) {
print(i + j);
}
void f3(F f) {
f(1, 2);
}
void main() {
f3(f2);
}
- 当然也可以直接导入方法
void f4( void f (int i, int j) ) {}
总结:在Java中,如果需要通知调用者或者其他地方方法执行过程的各种情况,可能需要指定一个接口,比如View的onClickListener。而在Dart中,我们可以直接指定一个回调方法给调用的方法,由调用的方法在合适的时机执行这个回调。
匿名方法
没有名字的方法,称之为匿名方法。用法与java
的lamda
表达式相同。
网友评论