1.本文主要讲一下Dart中的方法是怎么定义的,下面先看一个简单的例子:git
void printNumber(num number) { print('The number is $number.'); }
2.虽然Dart的编程规范推荐定义方法是要明确变量类型,但其实上面的代码咱们彻底能够写做:github
printNumber(number) { // Omitting types is OK. print('The number is $number.'); }
本人建议仍是使用第一种吧,代码的可读性比较强。编程
3.若是方法的方法体只有一个表达式,如上面这段代码,能够写成:闭包
void printNumber(num number) => print('The number is $number.');
这样是否是很高大上呢?有种lambda表达式的感受。这里须要注意的是当方法体是一个声明语句的时候就不能这样使用了,以下面这段代码就没法使用这种简写:ide
printNumber(number) { // Omitting types is OK. var N = number * 2 ; }
4.Dart中方法的定义也十分简单:函数
printNumber(2333);
5.Dart方法的参数有两种类型,必须参数和可选参数,其中必须参数定义在参数列表的前面部分,可选参数定义在参数列表的剩余部分。学习
可选参数又能够分为:可选命名参数
和可选位置参数
。同一个参数只能是可选命名参数或可选位置参数,不能兼具二者的功能。
同时可选参数能够设定默认值,如没有设定默认值则至关于null。命令行
可选命名参数顾名思义,就是在给其赋值的时候经过参数名来赋值。
可选命名参数使用{param1, param2, …}
这种形式定义,以下:code
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');
须要注意的是在调用包含可选位置参数的方法时,必定要根据可选位置参数的位置进行赋值。
在Dart中全部的程序都必须包含main方法来做为程序的入口。main方法的返回值是void而且它有一个List
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开源项目进行同步,欢迎关注。