美文网首页
Functions(方法) of Dart

Functions(方法) of Dart

作者: Kidnight | 来源:发表于2019-10-08 20:48 被阅读0次
void main(List<String> args) {

  /**
   * Dart是一个真正面向对象的语言,
   * 方法也是对象并且具有一种类型:Function。
   * 这意味着,方法可以赋值给变量,也可以当做其他方法的参数,也可以当做其他方法的参数。
   * 也可以把Dart类的实例当做方法来调用。
   * 
   */

  // 定义方法的示例:
  bool isDart(){
    return true;
  }

  // 在公开的API推荐使用静态类型,也可以选择忽略类型定义:
  isFlutter(){
    return false;
  }

  // 对于只有一个表达式的方法,可以选择使用缩写语法来定义
  // => expr 语法是 { return expr; }形式的缩写。 =>形式有时候也称之为 胖箭头 语法
  // 注意:在箭头(=>)和冒号(;)之间只能使用一个 表达式,不能使用语句。例如:你不能使用if statement,
  // 但是可以使用条件表达式 conditional expression
  bool isTrue() => true;

  /**
   * 方法可以有两种类型的参数:必需的 和 可选的。必需的参数在参数列表前面,后面是可选参数。
   */

  // Optional parameters (可选参数)
  // 可选参数可以是命名参数或者基于位置的参数,但是这两种参数不能同时当做可选参数。
  
  // Optional named parameters (可选命名参数)
  // 调用方法的时候,你可以使用这种形式 paraName:value 来指定命名参数。例如:enableFlags(bold: true, hidden: false);
  // 在定义方法的时候,使用 {oaram1,param2,...} 的形式来指定命名参数:
  enableFlags({bool bold,bool hidden}){

  }

  // Optional positional parameters (可选位置参数)
  // 把一些方法的参数放大 [] 中就变成可选位置参数了:
  String say(String from, String msg, [String device]){
    var result = '$from says $msg';
    if (device != null) {
      result = '$result with a $device';
    }
    return result;
  }

  // 下面是不使用可选参数调用上面方法的示例:
  assert(say('Bob', 'Howdy') == 'Bob says Howdy');

  // 下面是使用可选参数调用上面方法的示例:
  assert(say('Bob', 'Howdy', 'smoke signal') == 'Bob says Howdy with a smoke signal');

  // Default parameter values (默认参数)
  // 在定义方法的时候,可以使用 = 来定义可选参数的默认值。默认值只能是编译时常量。
  // 如果没有提供默认值,则默认值为null。
  // 下面是设置可选参数默认值的示例:
  void testOneFunction({bool bold = false, bool hidden = false}){
    print(bold);
    print(hidden);
  }
  // 版本问题:
  // Dart SDK < 1.21 的版本代码使用一个冒号(:)而不是 = 来设置参数默认值。
  // Dart SDK >= 1.21 的版本代码使用 = 来设置默认值。 
  // 下面的示例显示了如何设置位置参数的默认值:
  String sayTestFunction(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(sayTestFunction('Bob', 'Howdy') == 'Bob says Howdy with a carrier pigeon');

  // 还可以使用 list 或者 map 作为默认值。下面为示例:
  void doStuff(
    {
      List<int> list = const [1, 2, 3],
      Map<String, String> gifts = const {
        'first': 'paper',
        'second': 'cotton',
        'third': 'leather'
      }
    }
  ){
    list = [4, 5, 6];
    print('list: $list');
    print('gifts: $gifts');
  }

  // The main() function (入口函数)
  // 每个应用都需要有个顶级的 main() 入口方法才能执行。main() 方法的返回值为 void 并且有个可选的 List<String>参数。

  // Functions as first-class objects (一等方法对象)
  // 可以把方法当做参数,调用另外一个方法,例如:
  printElement(element){
    print(element);
  }
  var list = ['哈哈哈', '滴滴滴', '哒哒哒'];
  list.forEach(printElement);

  // 方法也可以赋值给一个变量:
  var loudify = (msg) => '${msg.toUpperCase()}';
  assert(loudify('hello') == 'HELLO');

  // Anonymous functions (匿名方法)
  // 大部分方法都带有名字,例如 main() 或者 printElement()
  // 也可以创建没有名字的方法,称之为 匿名方法。有时候也称之为 lambda 或者 closure 闭包。
  // 可以把匿名方法赋值给一个变量,然后可以使用这个方法,比如添加到集合 或者 从集合中删除。
  // 匿名函数和命名函数看起来类似,在括号之间可以定义一些参数,参数使用逗号分隔,也可以是可选参数。后面大括号中的代码为函数体。
  // 下面的代码定义了一个参数为i(该参数没有指定类型)的匿名函数。list中的每个元素都会调用这个函数来打印出来
  // 同时计算了每个元素在list中的索引位置:
  var listOne = ['apples', 'oranges', 'grapes', 'bananas', 'plums'];
  listOne.forEach((i){
    print(listOne.indexOf(i).toString() + ': ' + i);
  });
  // 如果方法只包含一个语句,可以使用胖箭头语法缩写:
  listOne.forEach((element) => print(listOne.indexOf(element).toString() + ': ' + element));

  // Lexical scope (静态作用域)
  // Dart 是静态作用域语言,变量的作用域在写代码的时候就确定过了。
  // 基本上大括号里面定义的变量就只能在大括号里面访问。
  // 下面是作用域的一个示例:
  var topLevel = true;
  void insideFunction(){
    var inside = true;
    void myFunction(){
      var my = true;
      void nestedFunction(){
        var nested = true;
        assert(topLevel);
        assert(inside);
        assert(my);
        assert(nested);
      }
    }
  }

  // Lexical closures (词法闭包)
  // 一个闭包是一个方法对象,不管该对象在何处被调用,该对象都可以访问其作用域内的变量。
  // 方法可以封闭定义到其作用域内的变量。
  // 下面示例中,makeAdder()捕获到了变量addBy。不管你在哪里执行 makeAdder() 所返回的函数,都可以使用 addBy 参数。
  Function makeAdder(num addBy) { // 定义一个方法,返回一个方法对象
    return (num i) => addBy + i;
  }
  var add2 = makeAdder(2);  // 创建一个 加2 的方法对象(闭包)
  var add4 = makeAdder(4);  // 创建一个 加4 的方法对象(闭包)
  assert(add2(3) == 5);
  assert(add4(3) == 7);
}


// Testing functions for equality (测试函数是否相等)
// 下面是测试顶级方法、静态函数和实例函数 相等的示例:

void foo() {}  // 顶级方法

class A {
  static void bar() {}  // 静态方法(类调用)
  void baz() {} //示例方法(对象调用)
}

main(List<String> args) {
  var x;

  // 比较顶级方法
  x = foo;
  assert(foo == x); // 相等

  // 比较静态方法
  x = A.bar;
  assert(A.bar == x); // 相等

  // 比较实例方法
  var v = new A();
  var w = new A();
  var y = w;
  x = w.baz;
  assert(y.baz == x); // 相等

  assert(v.baz != w.baz); // 不是同一个对象,不相等

  // Return values (返回值)
  // 所有的函数都返回一个值。如果没有指定返回值,则默认把语句 return null; 作为函数的最后一个语句执行。

}


相关文章

网友评论

      本文标题:Functions(方法) of Dart

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