트레이 트 컨텍스트에서 케이스 클래스 매개 변수에 액세스하는 방법

Aug 21 2020

나는 특성이 있습니다.

sealed trait foo

그리고 트레이 트를 확장하는 케이스 클래스 :

case class bar(data: List[String]) extends foo

bar의 데이터에 액세스하는 함수를 작성하고 싶지만 foo로 전달됩니다.

def doSomething(x: foo) = {does something with foo.data}

다음과 같이 호출됩니다.

val aBar = bar(some list)
doSomething(aBar)

하지만 doSomething 함수가 foo 유형을 기대할 때 액세스 할 수 없습니다. 막대 유형의 값에 액세스하려면이 문제를 어떻게 해결할 수 있습니까?

답변

2 SethTisue Aug 21 2020 at 08:53

프로그램의 맥락에서 이것이 의미가 있는지 모르겠지만 Foo다음과 같이 정의 할 수 있습니다.

trait Foo {
  def data: List[String]
}

그것이 의미가 없다면 아마도 패턴 일치를해야 할 것입니다 :

def doSomething(x: Foo) =
  x match {
    case bar: Bar => ...    // or `case Bar(data)`, as Luis suggests

내가 대문자로 표기 Foo하고 Bar모든 곳에서 사용했습니다. 클래스와 트레이 트 이름은 스칼라 코드에서 항상 대문자로 표기해야합니다. 최소한 다른 사람 (예를 들어 Stack Overflow에서 당신을 돕는 사람들)이 혼동하지 않고 코드를 읽을 수 있기를 원한다면.