def , val 및 var 사이의 Scala에 존재하는 구별로 시작합니다 .
def- 오른쪽 내용에 대한 불변 레이블 을 정의합니다.이 내용은 느리게 평가되며 이름으로 평가됩니다.
val- 값으로 평가되는 즉시 / 즉시 평가 되는 오른쪽 컨텐츠에 대한 불변 레이블 을 정의합니다 .
VAR은 - 정의 변경 가능한 변수 , 초기 평가 오른쪽의 내용으로 설정합니다.
예, def
scala> def something = 2 + 3 * 4
something: Int
scala> something // now it's evaluated, lazily upon usage
res30: Int = 14
예, val
scala> val somethingelse = 2 + 3 * 5 // it's evaluated, eagerly upon definition
somethingelse: Int = 17
예, var
scala> var aVariable = 2 * 3
aVariable: Int = 6
scala> aVariable = 5
aVariable: Int = 5
위와 같이 def 와 val의 레이블은 재 할당 할 수 없으며, 시도 할 경우 아래와 같은 오류가 발생합니다.
scala> something = 5 * 6
<console>:8: error: value something_= is not a member of object $iw
something = 5 * 6
^
클래스가 다음과 같이 정의 된 경우 :
scala> class Person(val name: String, var age: Int)
defined class Person
다음으로 인스턴스화했습니다.
scala> def personA = new Person("Tim", 25)
personA: Person
특정 Person 인스턴스 (예 : 'personA')에 대해 변경 불가능한 레이블 이 작성됩니다. 변경 가능한 필드 'age'를 수정해야 할 때마다 이러한 시도는 실패합니다.
scala> personA.age = 44
personA.age: Int = 25
예상대로 '연령'은 변경할 수없는 레이블의 일부입니다. 이 작업을 수행하는 올바른 방법은 다음 예제와 같이 변경 가능한 변수를 사용하는 것입니다.
scala> var personB = new Person("Matt", 36)
personB: Person = Person@59cd11fe
scala> personB.age = 44
personB.age: Int = 44 // value re-assigned, as expected
명확하게, 가변 변수 참조 (예 : 'personB')에서 클래스 가변 필드 'age'를 수정할 수 있습니다.
나는 위에서 언급 한 차이점에서 비롯된 모든 것이 스칼라 프로그래머를 염두에 두어야한다는 사실을 여전히 강조합니다.
val
변경할 수 있지만 val이 참조하는 객체는 변경할 수 없습니다. Aval
는 상수가 아닙니다.