#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 и пытается повторно присвоить новое значение входящему аргументу