Dart语言 3 方法

2019-01-19  本文已影响32人  芝麻酱的简书

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语法的一部分。

上一篇下一篇

猜你喜欢

热点阅读