1.本文主要讲一下Dart中的方法是怎么定义的,下面先看一个简单的例子:
void printNumber(num number) {
print('The number is $number.');
}
2.虽然Dart的编程规范推荐定义方法是要明确变量类型,但其实上面的代码我们完全可以写作:
printNumber(number) { // Omitting types is OK.
print('The number is $number.');
}
本人建议还是使用第一种吧,代码的可读性比较强。
3.如果方法的方法体只有一个表达式,如上面这段代码,可以写成:
void printNumber(num number) =>
print('The number is $number.');
这样是不是很高大上呢?有种lambda表达式的感觉。这里需要注意的是当方法体是一个声明语句的时候就不能这样使用了,如下面这段代码就无法使用这种简写:
printNumber(number) { // Omitting types is OK.
var N = number * 2 ;
}
4.Dart中方法的定义也十分简单:
printNumber(2333);
5.Dart方法的参数有两种类型,必须参数和可选参数,其中必须参数定义在参数列表的前面部分,可选参数定义在参数列表的剩余部分。
可选参数
可选参数又可以分为:可选命名参数 和可选位置参数 。同一个参数只能是可选命名参数或可选位置参数,不能兼具两者的功能。
同时可选参数可以设定默认值,如没有设定默认值则相当于null。
可选命名参数
可选命名参数顾名思义,就是在给其赋值的时候通过参数名来赋值。
可选命名参数使用{param1, param2, …} 这种形式定义,如下:
enableFlags({bool bold:false, bool hidden:true}) {
// ...
}
可选命名参数使用: 设置默认值。
可选命名参数的调用方式如下:
enableFlags(bold: true, hidden: false);
可选位置参数
可选位置参数与可选命名参数类似,不过它是通过位置来赋值的。
可选位置参数使用[] 包裹可选位置参数列表,与可选命名参数不同的是可选位置参数通过= 来设置默认值:
String say(String from, String msg,
[String device = 'carrier pigeon', String mood]) {
var result = '$from says $msg';
if (device != null) {
result = '$result with a $device';
}
if (mood != null) {
result = '$result (in a $mood mood)';
}
return result;
}
assert(say('Bob', 'Howdy') ==
'Bob says Howdy with a carrier pigeon');
需要注意的是在调用包含可选位置参数的方法时,一定要根据可选位置参数的位置进行赋值。
main方法
在Dart中所有的程序都必须包含main方法来作为程序的入口。main方法的返回值是void并且它有一个List类型的可选参数。下面是Dart在Web应用中的主函数写法:
void main() {
querySelector("#sample_text_id")
..text = "Click me!"
..onClick.listen(reverseText);
}
注意:..操作符可以用于对单个对象进行多重操作。
下面这个例子是Dart在命令行程序中的使用范例:
void main(List<String> arguments) {
print(arguments);
assert(arguments.length == 2);
assert(int.parse(arguments[0]) == 1);
assert(arguments[1] == 'test');
}
方法即对象
在Dart中你可以将方法作为参数传递给另一个方法:
printElement(element) {
print(element);
}
var list = [1, 2, 3];
// Pass printElement as a parameter.
list.forEach(printElement);
同样的,可以将方法赋值给一个变量:
var loudify = (msg) => '!!! ${msg.toUpperCase()} !!!';
assert(loudify('hello') == '!!! HELLO !!!');
语法范围
在Dart中方法可以嵌套,并且内层方法可以访问外层方法定义的变量:
var topLevel = true;
main() {
var insideMain = true;
myFunction() {
var insideFunction = true;
nestedFunction() {
var insideNestedFunction = true;
assert(topLevel);
assert(insideMain);
assert(insideFunction);
assert(insideNestedFunction);
}
}
}
语法闭包
闭包的作用是即使方法在原先声明范围外使用,方法内部的变量都是可访问的:
Function makeAdder(num addBy) {
return (num i) => addBy + i;
}
main() {
// 创建一个+2方法.
var add2 = makeAdder(2);
// 创建一个+4方法.
var add4 = makeAdder(4);
assert(add2(3) == 5);
assert(add4(3) == 7);
}
在上面这段代码中,add2,add4这两个方法在main方法中使用,但他们却可以访问addBy 这个变量。这就是语法闭包的意思。
方法的等价判断
下面这个例子用于展示顶层方法,静态方法和类成员方法(实例方法)的等效判断:
foo() {} // A top-level function
class SomeClass {
static void bar() {} // A static method
void baz() {} // An instance method
}
main() {
var x;
// Comparing top-level functions.
x = foo;
assert(foo == x);
// Comparing static methods.
x = A.bar;
assert(A.bar == x);
// Comparing instance methods.
var v = new A(); // Instance #1 of A
var w = new A(); // Instance #2 of A
var y = w;
x = w.baz;
// These closures refer to the same instance (#2),
// so they're equal.
assert(y.baz == x);
// These closures refer to different instances,
// so they're unequal.
assert(v.baz != w.baz);
}
返回值
所有的Dart方法都有返回值,若在代码中没有返,则返回值为null。
Dart的方法基本使用就讲到这里,更多的Dart学习内容和相关源码都会在github上的DartNovel开源项目进行同步,欢迎关注。
|
请发表评论