码迷,mamicode.com
首页 > 其他好文 > 详细

20180629 Scala Puzzlers-3

时间:2019-09-25 15:42:26      阅读:93      评论:0      收藏:0      [点我收藏+]

标签:编译   extend   warning   eof   异常   rap   打印   cti   instance   

  1. I Can Has Padding? 当给 foreach 传递一个语句时,注意该语句不要返回一个 Function1 对象,比如

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    val sb = new StringBuilder("hello")
    1 to 6 foreach { sb += '*' }

    // 而 StringBuilder 继承了 Function1,导致最后只添加了1个星号,然后调用 apply 6次,抛出越界异常

    // 再比如
    case class () extends (Any => Unit) {
    def apply(a: Any) = println(s"apply $a")
    def print(a:Any) = {println(a); this}
    }

    val foo = Foo()
    1 to 10 foreach (foo print "hello") // 打印1次 hello, 10次 apply
  2. Cast Away; 尽量让编译器执行类型转换,避免手动转换;当可能时,编译器会尽量在基本类型范围内执行操作,而不是包装类型

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    println(null.asInstanceOf[Int] == 0)
    println(null.asInstanceOf[Int] == null)
    println(null == 0)
    println(1 == 1)
    // Warning: comparing values of types Int and Null using `==' will always yield false
    // 第二行编译时警告总会返回 false,但实际返回是 true
    // 反编译结果,其中 unboxToInt(i) = return i == null ? 0 : ((java.lang.Integer)i).intValue();
    Predef$.MODULE$.println(BoxesRunTime.boxToBoolean(BoxesRunTime.unboxToInt(null) == 0));
    Predef$.MODULE$.println(BoxesRunTime.boxToBoolean(null == null));
    Predef$.MODULE$.println(BoxesRunTime.boxToBoolean(BoxesRunTime.boxToInteger(0) == null));
    Predef$.MODULE$.println(BoxesRunTime.boxToBoolean(true));

    // 第一行 Wrapper Int 与 0 比较,编译器尽量将 wrapper 转换为基本类型,导致 null 转换为 0,返回 true
    // 第二行 wrapper Int 与 null 比较,因为右边 null 不是 wrapper 类型,所以不转换

原文:大专栏  20180629 Scala Puzzlers-3


20180629 Scala Puzzlers-3

标签:编译   extend   warning   eof   异常   rap   打印   cti   instance   

原文地址:https://www.cnblogs.com/petewell/p/11584621.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!