IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    scala雾中风景(26): 变量查找的问题

    hongjiang发表于 2016-08-23 17:36:53
    love 0

    在Java/Scala的一个方法里,存在与全局变量同名的局部变量的话将会覆盖这个全局变量,但当在这个方法局部变量定义之前就引用这个变量,在Java和Scala的编译器里给出了不同的实现,先看Java里:

    ➜  cat B.java
    public class B {
        static String name = "noname";
        public static void main(String[] args) {
          System.out.println(name);
          String name = "wang";
        }
    }
    
    ➜  java B
    noname
    

    在main方法里第一行引用的name是全局变量,在同名的局部变量定义之前它从全局查找这个变量。而在Scala里:

     ➜  cat A.scala
    object A {
        val name: String = "noname"
    
        def main(args: Array[String]) {
            println(name)
            val name = "wang"
        }
    }
    
     ➜  scalac A.scala
    A.scala:5: error: forward reference extends over definition of value name
        println(name)
                ^
    one error found
    

    编译时错误,它优先从方法内部的局部变量表类查找了。我更接受Java里的方式,而且这种方式已经深入人心了,对Scala为何这样做我不清楚是出于什么考虑,是有意这样还是实现上的bug?



沪ICP备19023445号-2号
友情链接