Dart是一种真正的面向对象语言,因此即使是函数也是对象并且具有类型Function。这意味着函数可以分配给变量或作为参数传递给其他函数。
bool isNoble(int atomicNumber) {
return _nobleGases[atomicNumber] != null;
}
我们也可以简写为如下:(阅读性不好,不推荐)
isNoble(atomicNumber) {
return _nobleGases[atomicNumber] != null;
}
对于只包含一个表达式的函数,可以使用简写语法:
bool isNoble(int atomicNumber)=> _nobleGases [atomicNumber]!= null;
=> expr
语法是{return expr;
的简写。=>
表示法有时称为箭头语法。
注意:箭头(=>)和分号(;)之间只能出现表达式而非语句。
例如,您不能在其中放置if语句,但可以使用条件表达式。
参数类型
函数可以有两种类型的参数:必需和可选。首先列出所需参数,然后列出任何可选参数。命名的可选参数也可以标记为@required
。
可选参数分类:
可选参数可以是位置参数,也可以是命名参数,但不能同时都是。
- 可选的命名参数:
定义函数时,使用{param1,param2,...}
指定命名参数:
///设置[bold]和[hidden]标志......
void enableFlags({bool bold,bool hidden}){...}
调用函数时,可以使用paramName:value
指定命名参数。例如:
enableFlags(bold:true,hidden:false);
您可以使用@required
在任何Dart代码(不仅仅是Flutter)中注释命名参数,以指示它是必需参数。例如:
const Scrollbar({Key key,@required Widget child})
- 可选的位置参数:
在[]
中包装一组函数参数将它们标记为可选的位置参数:
String say(String from, String msg, [String device]) {
var result = '$from says $msg';
if (device != null) {
result = '$result with a $device';
}
return result;
}
默认参数值
您的函数可以使用=
来定义命名和位置参数的默认值。默认值必须是编译时常量。如果未提供默认值,则默认值为null
。
/// Sets the [bold] and [hidden] flags ...
void enableFlags({bool bold = false, bool hidden = false}) {...}
// bold will be true; hidden will be false.
enableFlags(bold: true);
Dart中函数是一等公民,可以作为方法参数:
void printElement(int 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 !!!');
所有函数都返回一个值。如果未指定返回值,则该语句返回null;隐式附加到函数体。
foo(){}
assert(foo()== null);
运行时类型判断符
as,is,and!
运算符在运行时检查类型很方便。
if (emp is Person) {
// Type check
emp.firstName = 'Bob';
}
或者
(emp as Person).firstName = 'Bob';
如果emp
不是Person
类型,则不会向后执行, 直接抛出异常。
分配运算符
要仅在变量为null时分配,请使用?? =
运算符。
//为a分配值
a = 值;
//如果b为null,则将值赋给b;否则,b保持不变
b ?? =值;
级联符号 ..
(..)
允许您对同一对象进行一系列操作。除了函数调用,您还可以访问同一对象上的字段。这通常可以为您节省创建临时变量的步骤,并允许您编写更多流畅的代码。
querySelector('#confirm') // Get an object.
..text = 'Confirm' // Use its members.
..classes.add('important')
..onClick.listen((e) => window.alert('Confirmed!'));
上面代码等价于:
var button = querySelector('#confirm');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e) => window.alert('Confirmed!'));
不可以在返回void
(其实就是返回null,方法没有返回值的时候,默认返回null)的方法上构造级联:
var sb = StringBuffer();
sb.write('foo')
..write('bar');
错误写法❌
Error: method 'write' isn't defined for 'void'.
注意:严格来说,级联的“双点”符号不是运算符。它只是Dart语法的一部分。
网友评论