Scala — переменные метода не являются неизменяемыми

#scala #jvm

#scala #jvm

Вопрос:

Похоже на ошибку в Scala, она позволяет изменять имена переменных метода.

В этом примере компилятор никогда не должен был разрешать повторное объявление параметра name в том же блоке метода.

 object App {

  def main(args: Array[String]): Unit = {
    testMethod()
  }

  def testMethod(name: String = "John Smith"): Unit = {
    val name = "John Doe"
    println(name)
  }

}
  

Есть ли какое-либо объяснение изменения имен переменных метода?

Вывод

 John Doe
  

Комментарии:

1. Локальная переменная и параметр метода отличаются.

2. name Аргумент затеняется, а не видоизменяется. Для демонстрации создайте новый name другой тип: val name = 77

Ответ №1:

Это не ошибка, а особенность. Это называется затенением.

Что на самом деле могло быть ошибкой, если бы вы могли это сделать:

 def testMethod(name: String = "John Smith"): Unit = {
  name = "John Doe" // does not compile
  println(name)
}
  

Обратите внимание, что name не является значением val и пытается повторно присвоить новое значение входящему аргументу