2014-10-13 2 views
1

내가 가지고있는 다음과 같은 클래스 설정 : 다음왜 내 개체 멤버 변수에 액세스 할 수 없습니까?

class MyClass { 
    class MyInnerClass(memberVar: String) 

    def getAInner: MyInnerClass = { 
    new MyInnerClass("hello") 
    } 
} 

내가 가지고있는 클래스의 외부에 다음 코드 : 왜이 ​​

def myFunction = { 
    val a = new MyClass 
    val b = a.getAInner.memberVar // value memberVar is not a member of a.MyInnerClass 
} 

입니까? 노아의 대답은 완전히 정확 @

class MyClass { 
    class MyInnerClass(val memberVar: String) 

    def getAInner: MyInnerClass = { 
     new MyInnerClass("hello") 
    } 
    } 

답변

5

당신은 그렇지 않으면 개인 값의 memberVar 공개를 만들기 위해 키워드 val를 추가해야합니다. 그것이 제공하는 설탕의 일부는 See here입니다. 나는 그것을 거의 반사적으로 사용한다. 귀하의 예제에서는 다음과 같습니다 변함없이, 나는 case class가 제공하는 제정신 기본값을 활용하기 원하기 때문에 내가 이런 식으로하는 경향이

object MyClass { 
    case class MyInnerClass(memberVar: String) 

    def getAInner: MyInnerClass = { 
    new MyInnerClass("hello") 
    } 
} 

def myFunction = { 
    val b = MyClass.getAInner.memberVar 
} 

.

외부 유형으로는 object을 사용하기로 선택했습니다. 매개 변수가 없으므로 간단하게하기 위해 외부 입력 유형을 선택했을 수도 있습니다.

2

, 그러나 나는 또한 case class를 사용할 수있는 옵션을 던질 것입니다 :

+0

'사례 클래스'가 정확히 무엇에 관한 정보를 제공 할 수 있습니까? 그것은 기본적으로 클래스의 인스턴스를 구조체로 변환합니까? – Max

+0

@Max는 몇 가지 참조를 추가했습니다. "구조체"가 의미하는 바에 따라 그것이 맞다고 말할 수있을 것입니다. 대부분의 구문 설탕은 자동으로 활성화됩니다. 99 %의 시간 동안 패턴 일치와 같은 새로운 스칼라 기능을 가능하게하고 싶습니다. – acjay

+0

@acjay 케이스 클래스를 사용하면 일반 클래스 컨텍스트에서는 덜 관용적 인'new' 키워드를 버릴 수 있습니다. 사례 클래스의 예로는'Some'와'None'이 있으며'new' 될 필요는 없습니다. case 클래스는 클래스에서 객체를 "래핑"하기위한 것입니다. 위 예제의 경우, (예를 들어'Some' 또는'Left' 또는'Success'와 같이) wrapped 할 필요가 없으므로, case 클래스의 사용은이 경우 관용적이지 않습니다. 그것에 대해 생각해 볼 수있는 또 다른 방법은 "패턴 매칭 할 필요가없는 경우 사례 클래스를 사용하지 마십시오." –

관련 문제