2017-09-04 3 views
0

저는 스칼라를 처음 접했고 비슷한 질문을 한 번 둘러 보았습니다.하지만 제 질문과 동일하다고 확신하지는 않습니다 - 내가 잘못하면 사과드립니다.스칼라가 여러 사례 클래스에 대한 배열로 값을 추출합니다

는 기본적으로, 나는 (내가 3 이상이 가지고) 모델의 수를이 코드

case class ModelX(a: Int, b: Int) 

case class ModelY(b: Int, c: Int) 

case class ModelZ(a: Int, c: Int) 


def extract_x(e: ModelX): Array[Any] = e.productIterator.map { 

    case op: Option[_] => op.getOrElse(null) 
    case v => v 

}.toArray 


def extract_y(e: ModelY): Array[Any] = e.productIterator.map { 

    case op: Option[_] => op.getOrElse(null) 
    case v => v 

}.toArray 


def extract_z(e: ModelZ): Array[Any] = e.productIterator.map { 

    case op: Option[_] => op.getOrElse(null) 
    case v => v 

}.toArray 

를 리팩토링하는 방법을 확실입니다. 내가이 일을하는 이유는 내가이 모델들 중 하나에 카산드라의 행을 추출 할 수 있다는 것인데,이 시점 이후 나에게 사용할 수있는 직렬화 방법을 가지고 있으므로 Array[Any]에 전달해야하고 반환 값을 사용할 수있다. 내 언어 선택에 더 편하게.

난 그냥 기본 클래스에 extract을 적용 할 수 있도록 확장 ModelX|Y|Z 기본 클래스를 정의하는 시도

하지만 productIterator는 기본 클래스에 사용할 수 없습니다.

class BaseModel() 

case class ModelX(a: Int, b: Int) extends BaseModel 

case class ModelY(b: Int, c: Int) extends BaseModel 

case class ModelZ(a: Int, c: Int) extends BaseModel 


def extract(e: BaseModel): Array[Any] = e.productIterator.map { 

    case op: Option[_] => op.getOrElse(null) 
    case v => v 

}.toArray 

내가 스칼라 아주 새로운, 그래서 내가 뭔가를 분명 놓친 상상 : 그 나쁜 설명이 있었다면, 내가 뭘하려 /이 있었다 싶었다. 여기에 어떤 도움을 주시면 감사하겠습니다. 그냥 그것은하거나 모든 Product에이 메소드를 호출 할 수있는 문제가되지 않을 수도 있습니다

def extract(e: Product): Array[Any] = ... 

를 작성할 수 있도록

아킬

답변

2

productIterator, 모든 경우 클래스를 확장 scala.Product에 정의되어 s뿐 아니라 당신의 모델. 이러한 문제가 발생하지 않도록하려면, 당신의 마지막 조각에서 BaseModelProduct을 확장합니다

abstract class BaseModel() extends Product 

은이 용어에 익숙하지 않은 경우에는 추상 클래스를 검색합니다.

+0

고마워요! 첫 번째 제안은 완벽하게 작동했습니다. –