美文网首页
Dart语言 3 方法

Dart语言 3 方法

作者: 芝麻酱的简书 | 来源:发表于2019-01-19 14:02 被阅读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语法的一部分。

    相关文章

      网友评论

          本文标题:Dart语言 3 方法

          本文链接:https://www.haomeiwen.com/subject/xhvadqtx.html