• Dart随记


    Dart里命名构造方法,factory方法和static方法的区别:

    1.命名构造方法只能返回自己的类型;

    2.factory方法可以返回子类类型;

    3.static方法可以返回任意类型;

    当一个方法即是构造方法,又是factory方法时,它优先是factory方法(具有factory的特性),如external factory List([int? length]);因此List()可以返回其子类(null safety不可调用,因为需要提供fill的值,即有长度时的元素默认值)

    lambda表达式分为两种,一种是有=>的,这种最好不要加{},而它的返回值就是表达式的返回值(注意赋值语句返回null,但是注意set比较特别,它不会去对返回类型去求值,因此set mapX(y) => {y}这种写法也是可以的),而没有=>的则要用{}包裹,且里面是语句(和Java一样);

    因为set不会去计算返回类型,所以最好不要写void set mapY(y) ...;而是直接写set mapY(y)...;比较合适;

    dart里对于SplayTreeSet允许是dynamic是有原因的,比如:

    var set = SplayTreeSet((a, b) => a.toString().compareTo(b.toString()));
      set.add("ss");
      set.add(8);

     这种情况下就允许key是不同类型;

    对于extension里的static方法,可以这么理解,没有加static的方法其实隐式的是

    
    
    extension IntExtension on int {
    (extension) int doubleInt() {  // 注意,实际代码里用的时候是没有(extension)的
    return this * 2;
    }
    }

    而加了static的则那个隐式的(extension)就没了,因此是针对IntExtension的一个静态方法;【因此doubleInt虽然是编译时转换为一个方法,但是不能看成是静态方法,就像factory方法不能看成static方法一样,虽然用法很像

    ,3.doubleInt() 甚至编译的时候都不是类似静态方法一样调用,即IntExtension.doubleInt(3),而就是直接变成(3 * 2)】

    而且注意,extension是没有构造方法的(也不能显式定义),因此不能初始化一个extension类型的对象;

    还有就是extension类型(甚至都不能称之为类型)不能反射(所以它不是Type);

  • 相关阅读:
    Django model中的内嵌类(Class Meta)
    drf框架(二)
    drf框架(一)
    html、CSS 简单回顾
    前端vue框架(五)
    前端vue框架(四)
    前端Vue框架(三)
    前端vue框架(二)
    前端开发Vue框架(二)
    mysql 比较两个日期的时间差
  • 原文地址:https://www.cnblogs.com/silentdoer/p/13523942.html
Copyright © 2020-2023  润新知