[SCALA] 스칼라 데프, 발, 및 VAR의 사용
SCALA스칼라 데프, 발, 및 VAR의 사용
class Person(val name:String,var age:Int )
def person = new Person("Kumar",12)
person.age = 20
println(person.age)
코드 줄 = 20 인 person.age가 성공적으로 실행 된 경우에도, (12)로 출력한다. 나는 데프 사람 = 새로운 사람 ( "쿠마", 12)에 데프 사용했기 때문에 이런 것을 발견했다. 내가 VAR 또는 발을 사용하는 경우 출력이 나는 기본 스칼라에 발 이해 (20)이다. 이:
def age = 30
age = 45
그것은 기본적으로 발이기 때문에 ... 컴파일 오류를 제공합니다. 왜 라인의 첫 번째 세트 이상 제대로 작동하지 않습니다, 아직 또한 오류 않아?
해결법
-
==============================
1.스칼라에서 일을 정의하는 세 가지 방법이 있습니다 :
스칼라에서 일을 정의하는 세 가지 방법이 있습니다 :
코드를 보면 :
def person = new Person("Kumar",12)
이 사람이라는 새로운 방법을 정의합니다. 이 매개 변수가없는 방법으로 정의되어 있기 때문에 당신은 ()없이이 메서드를 호출 할 수 있습니다. 빈 괄호 방법의 경우, 또는 ') ('없이 호출 할 수 있습니다. 당신은 간단하게 작성하는 경우 :
person
당신은이 방법을 요구하고있다 (그리고 당신이 반환 값을 지정하지 않는 경우, 그냥 삭제됩니다). 이 코드 줄에서 :
person.age = 20
무슨 일 먼저 사람의 메소드를 호출하고, 반환 값 (클래스 사람의 인스턴스)에 당신은 세 멤버 변수를 변경하는 것입니다.
그리고 마지막 줄 :
println(person.age)
여기에 다시 (12로 설정 나이) Person 클래스의 새로운 인스턴스를 반환하는 사람 방법을 요구하고있다. 그것은이 같은입니다 :
println(person().age)
-
==============================
2.나는 데프, 발 및 VAR 사이 스칼라에 존재하는 차이에 의해 시작했으면합니다.
나는 데프, 발 및 VAR 사이 스칼라에 존재하는 차이에 의해 시작했으면합니다.
예, DEF
scala> def something = 2 + 3 * 4 something: Int scala> something // now it's evaluated, lazily upon usage res30: Int = 14
예, 발
scala> val somethingelse = 2 + 3 * 5 // it's evaluated, eagerly upon definition somethingelse: Int = 17
예였다
scala> var aVariable = 2 * 3 aVariable: Int = 6 scala> aVariable = 5 aVariable: Int = 5
위의에 따르면, 데프와 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
불변 인 라벨 (즉, '개인')의 특정 인스턴스에 대해 생성된다. 변경이 용이 한 필드 '나이'를 수정해야 할 때마다, 이러한 시도가 실패 :
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')로부터는, 클래스 변경 가능한 필드 연령 '를 변경할 수있다.
나는 아직도 모든 것이 어떤 스칼라 프로그래머의 마음에 명확하게해야하는 위에서 언급 한 차이에서 유래한다는 사실을 강조한다.
-
==============================
3.와
와
def person = new Person("Kumar", 12)
당신이 완전히 유효하며 컴파일러가 불평 할 이유가 없습니다 항상 이름 "쿠마"나이 12에 새로운 사람 인스턴스를 반환하는 함수 / 게으른 변수를 정의하고 있습니다. 인 person.age를 호출하면 항상 12이 새로 만든 사람 인스턴스의 나이를 반환합니다.
쓸 때
person.age = 45
당신은 나이 VAR로 선언되어 있기 때문에 유효 Person 클래스의 세 속성에 새 값을 할당합니다. 이 같은 새로운 Person 객체와 사람을 재 할당하려고하면 컴파일러는 불평 할 것이다
person = new Person("Steve", 13) // Error
-
==============================
4.또 다른 관점을 제공하기 위해, 스칼라에서 "데프는"이 사용되는 경우 발 바로 한 번만 평가 일 동안, 매번 평가됩니다 것을 의미합니다. 여기서, 표현 데프 사람 = 새로운 사람 ( "쿠마", 12) 우리는 "사람"을 사용할 때마다 우리는 새로운 사람 ( "쿠마", 12) 호출을 얻을 것이다 수반한다. 따라서 두 "인 person.age는"비 관련이있는 것은 당연합니다.
또 다른 관점을 제공하기 위해, 스칼라에서 "데프는"이 사용되는 경우 발 바로 한 번만 평가 일 동안, 매번 평가됩니다 것을 의미합니다. 여기서, 표현 데프 사람 = 새로운 사람 ( "쿠마", 12) 우리는 "사람"을 사용할 때마다 우리는 새로운 사람 ( "쿠마", 12) 호출을 얻을 것이다 수반한다. 따라서 두 "인 person.age는"비 관련이있는 것은 당연합니다.
이것은 내가 스칼라를 이해하는 방식 (아마도 더 "기능"방식)입니다. 나는 잘 모르겠어요
def defines a method val defines a fixed value (which cannot be modified) var defines a variable (which can be modified)
스칼라 그래도 의미하고자 정말로이다. 난 정말 적어도 그렇게 생각하고 싶지 않아요 ...
-
==============================
5.긴타로 이미 말했듯이, 사람 (때문에 데프의) 방법은 항상 새로운 사람 인스턴스를 반환합니다. 당신이 발견으로 당신이 VAR 또는 발에 방법을 변경하는 경우가 작동합니다 :
긴타로 이미 말했듯이, 사람 (때문에 데프의) 방법은 항상 새로운 사람 인스턴스를 반환합니다. 당신이 발견으로 당신이 VAR 또는 발에 방법을 변경하는 경우가 작동합니다 :
val person = new Person("Kumar",12)
또 다른 가능성은 다음과 같습니다
def person = new Person("Kumar",12) val p = person p.age=20 println(p.age)
그러나 인 person.age은 코드에서 = (20)은 사람의 방법에서 다시 사람 인스턴스를 얻을으로 허용되며,이 경우에 당신은 VAR의 값을 변경할 수 있습니다. 문제는 그 선 후 (사람 호출 할 때마다 새로운 인스턴스를 생성하므로) 그 인스턴스에 더 이상 언급이 없다는 것이다.
이것은 당신이 자바에서 정확히 같은 행동을 할 것이다, 아무것도 특별하다 :
class Person{ public int age; private String name; public Person(String name; int age) { this.name = name; this.age = age; } public String name(){ return name; } } public Person person() { return new Person("Kumar", 12); } person().age = 20; System.out.println(person().age); //--> 12
-
==============================
6.의이를 보자 :
의이를 보자 :
class Person(val name:String,var age:Int ) def person =new Person("Kumar",12) person.age=20 println(person.age)
와 동등한 코드로 재 작성
class Person(val name:String,var age:Int ) def person =new Person("Kumar",12) (new Person("Kumar", 12)).age_=(20) println((new Person("Kumar", 12)).age)
데프하는 방법입니다 참조하십시오. 그것은 호출 할 때마다 실행되며, 각 시간은 (a)는 새로운 사람 ( "쿠마", 12)를 반환합니다. 정말 (VAR에서 제공)을 age_ = 방법에 할당하지만, 단지 호출하지 않기 때문에 그리고 이것들은 "할당"에 오류입니다.
from https://stackoverflow.com/questions/4437373/use-of-def-val-and-var-in-scala by cc-by-sa and MIT license
'SCALA' 카테고리의 다른 글
[SCALA] 어떻게 sc.textFile에서 로컬 파일을로드하는 대신 HDFS하기 (0) | 2019.10.30 |
---|---|
[SCALA] 어떻게 스칼라에서 java.String.format를 사용 하는가? (0) | 2019.10.30 |
[SCALA] 어떻게 풍부하게 - 내 라이브러리 스칼라 컬렉션에 패턴을 적용합니까? (0) | 2019.10.30 |
[SCALA] 스칼라 : 제네릭 대 추상은 유형 (0) | 2019.10.30 |
[SCALA] 스칼라의 밀봉 특성의 반복? (0) | 2019.10.30 |