Scala의 기본 생성자에서 로컬 var / val을 어떻게 정의합니까?
Scala에서 클래스의 기본 생성자는 명시적인 본문이 없지만 클래스는 암시 적으로 정의됩니다. 다음 필드와 로컬 값 (즉, 생성자 메소드에 로컬 값)을 어떻게 구분합니까?
예를 들어, "Programming in Scala"의 일부 샘플 코드를 수정 한 다음 코드 스 니펫을 사용하십시오.
class R(n: Int, d: Int) {
private val g = myfunc
val x = n / g
val y = d / g
}
내 이해는 개인 "g", 공개 "x"및 "y"의 세 필드가있는 클래스를 생성한다는 것입니다. 그러나 g 값은 x 및 y 필드의 계산에만 사용하고 생성자 범위를 넘어서는 의미가 없습니다.
따라서이 (인위적인) 예제 에서이 생성자에 대한 로컬 값을 어떻게 정의합니까?
예
class R(n: Int, d: Int) {
val (x, y) = {
val g = myfunc
(n/g, d/g)
}
}
이를 수행하는 몇 가지 방법이 있습니다. 개인 정의 내에서 사용할 임시 변수를 선택할 수 있습니다. 식을 반환하는 블록 내에서 임시 변수를 사용할 수 있습니다 (예 : Alaz의 답변). 또는 마지막으로 대체 생성자 내에서 사용할 수 있습니다.
대체 생성자와 방식 방식으로 개체-컴패니언의 "적용"메서드 내에서 정의 할 수도 있습니다.
할 수없는 것은 필드를 "임시"로 선언하는 것입니다.
또한 기본 생성자 수신 한 매개 변수도 필드라는 점에 유의하십시오. 일반적으로 사용되는 변수가 필드가되는 것을 사용하는 경우 생성자의 실제 필드를 노출하지 않고 사용하는 경우 일반적인 솔루션은 기본 생성하는 실제 필드와 함께 비공개로 생성하는 대체 생성자 또는 객체-컴패니언의 적용 ()을 유효한 "기본"생성자로 사용합니다.
또한 메소드를 빌더로 사용하는 것입니다. 이 접근 방식을 귀하의 예제에 적용하면 (말장난이 의도하지 않음) 다음과 같이 보일 것입니다.
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);
이것은 약간 장황하지만 더 나쁠 수 있다고 생각합니다. :). private [this] vals가 Scala의 릴리스에서 임시 변수로 취급되기를 바랍니다. Martin 자신이 그것을 암시했습니다.
Martin Odersky의 의견을 포함하여 주제에 대한 몇 가지 토론이 여기에 있습니다.
'ProgramingTip' 카테고리의 다른 글
HTML의 첫 번째 줄에없는 토큰 < (0) | 2020.12.05 |
---|---|
docker : 잘못된 참조 형식 (0) | 2020.12.05 |
Google 인덱싱 내 Github 저장소를 중지하는 방법 (0) | 2020.12.05 |
Google server putty connect '연결 끈 : 지원되는 인증 방법이 없습니다 (전송 된 서버 : 공개 키). (0) | 2020.12.05 |
intrinsicContentSize 및 sizeThatFits의 적절한 사용 : 자동 레이아웃이있는 UIView 하위 클래스에서 (0) | 2020.12.05 |