복붙노트

[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. ==============================

    1.스칼라에서 일을 정의하는 세 가지 방법이 있습니다 :

    스칼라에서 일을 정의하는 세 가지 방법이 있습니다 :

    코드를 보면 :

    def person = new Person("Kumar",12)
    

    이 사람이라는 새로운 방법을 정의합니다. 이 매개 변수가없는 방법으로 정의되어 있기 때문에 당신은 ()없이이 메서드를 호출 할 수 있습니다. 빈 괄호 방법의 경우, 또는 ') ('없이 호출 할 수 있습니다. 당신은 간단하게 작성하는 경우 :

    person
    

    당신은이 방법을 요구하고있다 (그리고 당신이 반환 값을 지정하지 않는 경우, 그냥 삭제됩니다). 이 코드 줄에서 :

    person.age = 20
    

    무슨 일 먼저 사람의 메소드를 호출하고, 반환 값 (클래스 사람의 인스턴스)에 당신은 세 멤버 변수를 변경하는 것입니다.

    그리고 마지막 줄 :

    println(person.age)
    

    여기에 다시 (12로 설정 나이) Person 클래스의 새로운 인스턴스를 반환하는 사람 방법을 요구하고있다. 그것은이 같은입니다 :

    println(person().age)
    
  2. ==============================

    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. ==============================

    3.와

    def person = new Person("Kumar", 12) 
    

    당신이 완전히 유효하며 컴파일러가 불평 할 이유가 없습니다 항상 이름 "쿠마"나이 12에 새로운 사람 인스턴스를 반환하는 함수 / 게으른 변수를 정의하고 있습니다. 인 person.age를 호출하면 항상 12이 새로 만든 사람 인스턴스의 나이를 반환합니다.

    쓸 때

    person.age = 45
    

    당신은 나이 VAR로 선언되어 있기 때문에 유효 Person 클래스의 세 속성에 새 값을 할당합니다. 이 같은 새로운 Person 객체와 사람을 재 할당하려고하면 컴파일러는 불평 할 것이다

    person = new Person("Steve", 13)  // Error
    
  4. ==============================

    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. ==============================

    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. ==============================

    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_ = 방법에 할당하지만, 단지 호출하지 않기 때문에 그리고 이것들은 "할당"에 오류입니다.

  7. from https://stackoverflow.com/questions/4437373/use-of-def-val-and-var-in-scala by cc-by-sa and MIT license