복붙노트

[SCALA] 당신은 어떻게 스칼라의 기본 생성자에서 로컬 VAR / 발을 정의합니까?

SCALA

당신은 어떻게 스칼라의 기본 생성자에서 로컬 VAR / 발을 정의합니까?

스칼라에서는 클래스의 기본 생성자는 명시 적 본문이 없지만, 클래스 본문에서 암시 적으로 정의된다. 그렇다면, 하나의 필드의 값과 로컬 구별 않는다 (즉 생성자 메소드 로컬 값)?

예를 들어, 다음 코드 조각 "스칼라 프로그래밍"에서 몇 가지 예제 코드의 수정 된 형태를 취한다 :

class R(n: Int, d: Int) {
   private val g = myfunc
   val x = n / g
   val y = d / g
}

개인 "g"공공 "X"와 "Y": 나의 이해는이 세 개의 필드로 클래스를 생성하는 것입니다. 그러나, g 값은 x 및 y 필드의 계산을 위해 사용되며, 생성자 범위 외의 의미가 없다.

그래서이 (틀림없이 인공)의 예에서, 당신은 어떻게이 생성자 로컬 값을 정의 가야합니까?

해결법

  1. ==============================

    1.EG

    EG

    class R(n: Int, d: Int) {
      val (x, y) = {
        val g = myfunc
        (n/g, d/g)
      }
    }
    
  2. ==============================

    2.그렇게 할 수있는 몇 가지 방법이 있습니다. 당신은 건설 기간 동안 사용할 수 있도록, 개인 정의 내에서 임시 변수를 선언 할 수 있습니다. 당신은 (예 : Alaz의 대답으로) 표현을 반환 블록 내에서 임시 변수를 사용할 수 있습니다. 또는, 마지막으로, 당신은 대체 생성자 내에서 같은 변수를 사용할 수 있습니다.

    그렇게 할 수있는 몇 가지 방법이 있습니다. 당신은 건설 기간 동안 사용할 수 있도록, 개인 정의 내에서 임시 변수를 선언 할 수 있습니다. 당신은 (예 : Alaz의 대답으로) 표현을 반환 블록 내에서 임시 변수를 사용할 수 있습니다. 또는, 마지막으로, 당신은 대체 생성자 내에서 같은 변수를 사용할 수 있습니다.

    대체 생성자와 유사한 방식으로, 당신은 또한 객체 동반자의 "적용"방법 내부를 정의 할 수 있습니다.

    당신이 할 수없는 것은 "일시적"으로 필드를 선언합니다.

    기본 생성자에 의해받은 매개 변수는 필드도 있음을 유의하십시오. 당신은 매개 변수 필드되고 싶어하지 않으며, 생성자의 실제 필드를 노출하지 않으려는 경우, 일반적인 해결책은 실제 필드, 기본 생성자는 비공개로하는 것입니다, 사용 중 다른 생성자 또는 객체 동반자의 유효 "차"생성자로 () 적용됩니다.

  3. ==============================

    3.우리가 가지고있는 또 다른 옵션은 기본 객체 생성자 비공개 및 객체의이 빌더로 방법을 적용 동반자를 사용하는 것입니다. 우리는 당신의 예에 (말장난 의도되지 않음)이 방법을 적용하는 경우는 다음과 같이 표시됩니다

    우리가 가지고있는 또 다른 옵션은 기본 객체 생성자 비공개 및 객체의이 빌더로 방법을 적용 동반자를 사용하는 것입니다. 우리는 당신의 예에 (말장난 의도되지 않음)이 방법을 적용하는 경우는 다음과 같이 표시됩니다

    class R private (val x: Int, val y: Int);
    
    object R {
      def apply(n: Int, d: Int): R = {
        val g = myfunc;
        new R(n / g, d / g);
      }
    }
    

    에 R 인스턴스 대신을 만들려면 :

    val r = new R(1, 2);
    

    쓰다:

    val r = R(1, 2);
    

    이것은 자세한 조금이지만 더 악화 될 수있다, 나는 :) 생각합니다. [이] 발스는 스칼라의 향후 릴리스에서 임시 변수로 민간 처리됩니다하자 희망. 마틴 자신은 그것을 암시했다.

  4. ==============================

    4.마틴 오더 스키의 의견을 포함하여이 주제에 대한 논의는 여기

    마틴 오더 스키의 의견을 포함하여이 주제에 대한 논의는 여기

  5. from https://stackoverflow.com/questions/1118669/how-do-you-define-a-local-var-val-in-the-primary-constructor-in-scala by cc-by-sa and MIT license