Влияет ли неизменяемая метка против val на тип возвращаемого значения метода? - PullRequest
0 голосов
/ 04 октября 2018

Заголовок объясняет вопрос, а вот пример кода:

def foo(): String = {
    var result: String = new String()
    result
}

def bar(): String = {
    val result = new String()
    result
}

Влияет ли var против val только на переменную в области действия метода?Или возвращаемый тип неявно поддерживает статус неизменяемости / изменчивости?Например, тип возвращаемого значения из bar () остается неизменным?

Прости мое невежество, я совершенно новичок в скале.

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Тип возвращаемого значения обоих методов - String.Независимо от того, возвращалось ли значение из val или var, они оба возвращают String.Значение val или var находится в локальной области видимости, оно не закрывается чем-то и перестает существовать после завершения вызова метода.одна из целей Scala - иметь строгую типизацию, чтобы вы могли объединять функции в цепочку и иметь некоторую уверенность в том, что, если он скомпилируется, он может действительно работать;если внутренняя реализация метода играет на том, как вы должны обрабатывать его возвращаемое значение, все это развалится.

Изменчивость самого объекта зависит от того, как объект реализован, а не от того, как на него ссылаются.Строка является неизменной, потому что ее разработчики позаботились о том, чтобы не было никакого способа изменить ее внутреннее состояние.var только означает, что переменная позволяет заменять ссылку на другую.

Дискуссии на языке Java об неизменности или о том, что такое ссылка, применимы и к Scala.

0 голосов
/ 04 октября 2018

Короче говоря, var и val отмечают способность и неспособность, соответственно, переназначить имя в данной области.

val означает, что ссылка на объект в этой области не можетменять;хотя базовый объект может измениться.var означает, что объект, на который ссылается эта область, может измениться, поэтому его можно переназначить.

По сути, если объект, покидающий область действия функции, является изменяемым, он может быть изменен независимо от var или val.

См. Следующий пример:

scala> import scala.collection.mutable.ArrayBuffer
import scala.collection.mutable.ArrayBuffer

scala> def foo(): ArrayBuffer[Int] = {
     |   val buff = new ArrayBuffer[Int]()
     |   buff
     | }
foo: ()scala.collection.mutable.ArrayBuffer[Int]

scala> def bar(): ArrayBuffer[Int] = {
     |   var buff = new ArrayBuffer[Int]()
     |   buff
     | }
bar: ()scala.collection.mutable.ArrayBuffer[Int]

scala> val fooBuff = foo()
fooBuff: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer()

scala> fooBuff.append(1)

scala> val barBuff = bar()
barBuff: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer()

scala> barBuff.append(1)

scala> println(fooBuff); println(barBuff)
ArrayBuffer(1)
ArrayBuffer(1)

Однако, если базовый объект не является изменяемым, он не будет изменяться вне области действия.

Для получения дополнительной информации см. этот пост .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...