Scala 斯卡拉贝壳。多次声明相同的变量名称

Scala 斯卡拉贝壳。多次声明相同的变量名称,scala,read-eval-print-loop,Scala,Read Eval Print Loop,在Scala Shell中,我可以多次声明同一个变量,并且不会得到任何错误/警告 比如说 scala> val a = 1 a : Int = 1 scala> val a = 2 a : Int = 2 scala> val a = 1 a : Int = 1 scala> lazy val a = 1 a : Int = <lazy> scala>val a=1 a:Int=1 scala>vala=2 a:Int=2 scala>vala=1 a:In

在Scala Shell中,我可以多次声明同一个变量,并且不会得到任何错误/警告

比如说

scala> val a = 1
a : Int = 1
scala> val a = 2
a : Int = 2
scala> val a = 1
a : Int = 1
scala> lazy val a = 1
a : Int = <lazy>
scala>val a=1
a:Int=1
scala>vala=2
a:Int=2
scala>vala=1
a:Int=1
scala>延迟值a=1
a:Int=
这里变量名“a”用
var
val
lazy val
多次声明

所以我想知道

  • scala complier是如何处理的?例如:
    val a=1
    var a=2
    哪个优先级更高
  • 为什么Scala shell在多次声明相同的变量名时接受
  • 既然相同的变量名被声明为
    var
    val
    ,我如何知道声明的变量是可变的还是不可变的

  • 注意:在IntelliJ中,能够多次声明同一变量,我看不到错误,但当访问IDE时,错误显示为“无法解析变量”,那么多次声明同一变量有什么用呢?

    在repl中,经常会进行实验和原型设计,重新定义val通常不是错误的,但这是故意的

    以您最后键入的内容为准

    scala> val a: Int = 7
    a: Int = 7
    
    scala> val a: Int = "foo"
    <console>:12: error: type mismatch;
     found   : String("foo")
     required: Int
           val a: Int = "foo"
                        ^
    
    scala> a
    res7: Int = 7
    

    但是,如果您使用
    :pas
    技术粘贴一个代码块,多个冲突的名称将不起作用,整个代码块将被丢弃。

    在repl中,经常会进行实验和原型设计,重新定义val通常不是错误的,而是故意的

    以您最后键入的内容为准

    scala> val a: Int = 7
    a: Int = 7
    
    scala> val a: Int = "foo"
    <console>:12: error: type mismatch;
     found   : String("foo")
     required: Int
           val a: Int = "foo"
                        ^
    
    scala> a
    res7: Int = 7
    

    但是,如果您使用
    :pas
    技术粘贴一个代码块,那么多个冲突的名称将不起作用,整个代码块将被丢弃。

    REPL通常为了方便起见允许这样做,其基本思想是,在交互编码时,尤其是通过一次执行几个语句,对标识符的重新定义应该覆盖以前的那些。考虑每一个提示打开一个新的范围。一个RePL通常允许这样做,一般的想法是,当交互编码时,特别是每次执行少量语句时,对标识符的重新定义应该覆盖先前的标识符。考虑每个提示打开一个新的作用域。