zoukankan      html  css  js  c++  java
  • 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);

  • 相关阅读:
    简单字符串处理应避免使用正则表达式
    提高正则表达式的可读性
    用零宽度断言匹配字符串中的特定位置
    避免不必要的回溯
    预编译正则表达式
    用Text::CSV_XS模块处理csv文件
    Ack 类似grep一样的查找
    Apache压力测试
    仅编译正则表达式一次
    排序上下箭头的是实现
  • 原文地址:https://www.cnblogs.com/silentdoer/p/13523942.html
Copyright © 2011-2022 走看看