2014-03-31 49 views
4
scala> val hi = "Hello \"e" 
hi: String = Hello "e 


scala> val hi = "go" 
hi: String = go 

在同一个REPL会话中,为什么它允许我声明同名变量hi?为什么可以在REPL中声明具有相同名称的变量?

scala> hi 
res1: String = go 

scala> hi="new" 
<console>:8: error: reassignment to val 
    hi="new" 
    ^

这个错误我明白,我们不能重新分配VAL

回答

2

在第一段代码我相信这是REPL的“功能”,允许你重新定义hi。假设您正在通过在REPL中构建一小段代码来工作,那么返回并更改先前的定义而不重写其他值以使用不同的值可能会有所帮助。

使用scalac进行编译时,以下代码将给出错误error: x is already defined as value x

class Foo{ 
    val x = "foo" 
    val x = "foo" 
} 

在第二部分的代码,你正在试图重新分配val不能改变。这是你所期望的。

10

的REPL的有趣的设计特点是,你的两个定义被翻译为:

object A { 
    val greeting = "hi" 
} 
object B { 
    val greeting = "bye" 
} 

随后的使用将导入最后一个定义:

object C { 
    import B.greeting 
    val message = s"$greeting, Bob." // your code 
} 

你可以看到确切的包装策略与scala -Xprint:parser

object $iw extends scala.AnyRef { 
    def <init>() = { 
    super.<init>(); 
    () 
    }; 
    import $line4.$read.$iw.$iw.greeting; 
    object $iw extends scala.AnyRef { 
    def <init>() = { 
     super.<init>(); 
    () 
    }; 
    val message = StringContext("", ", Bob.").s(greeting) 
    } 
} 
相关问题