2012-03-13 2 views
4

모델 개체 집합과 래퍼 개체 집합을 사용하여 추가 기능을 제공합니다.스칼라 - 함수 허용 블록에 대한 약식 인수로 컴패니언 개체 사용

class Model 
class ModelWrapper(val m: Model) 
object ModelWrapper { def apply(model: Model) = new ModelWrapper(model) } 

val m1 = new Model; val m2 = new Model; val m3 = new Model 

List(m1, m2, m3).map(ModelWrapper) 
그래서

ModelWrapper,로 전달 : 나는이 같은 List("x", "y", "z").foreach(println)을 쓸 수 같은 속기를 사용하여 간결 래퍼 객체 모델 객체의 컬렉션을 변환 할 수 있도록하고 싶습니다

인수는 컴패니언 개체에 대한 호출 ModelWrapper(_)으로 변환됩니다. 나는이 때

그러나, 나는 형식 불일치 오류 다음과 같이 얻을 : 나는 case classModelWrapper을 할 경우,

<console>:14: error: type mismatch; 
found : ModelWrapper.type (with underlying type object ModelWrapper) 
required: Model => ? 
        List(m1, m2, m3).map(ModelWrapper) 

그러나을하고 동반자 개체를 제거, 그것을 작동합니다. 내가 추가하는 동작이 케이스 클래스가 작동하는 전반적인 방식과 잘 맞지 않아 케이스 클래스로 만들고 싶지 않습니다. 매개 변수와 동일한 모델 클래스를 갖는 두 개의 래퍼 클래스는 반드시 같을 필요는 없습니다.

제가 알고 싶습니다.이 경우 사례 클래스와 동반 개체의 차이점은 무엇입니까? 케이스 클래스를 사용하지 않고도 원하는 것을 얻을 수 있습니까?

+0

나는 티켓을 열어 본다. 그 행동은 의심스럽게 모순 된 것처럼 보입니다. –

+0

나는 그렇게 할 것이다 ... – Russell

답변

10

동반자 객체는 함수이어야합니다

object ModelWrapper extends Function1[Model, ModelWrapper] { def apply(model: Model) = new ModelWrapper(model) } 

또는이 약어 선호하는 것입니다 수 있습니다 : 어떤 이유로

object ModelWrapper extends (Model => ModelWrapper) { def apply(model: Model) = new ModelWrapper(model) } 
+0

재미있는 것은 스칼라 스펙에 따르면, 내장형 컴패니언 오브젝트가 함수 특성을 구현하지 않는다는 것이다. 어쩌면 또 다른 설명이있을 것입니다. – Nicolas

+1

이 작업은 승인 된 것으로 표시되므로 감사합니다. 그러나 나는 그 차이를 일으키는 원인을 알기에 관심이있을 것입니다. 완전 추측하지만 내장 된 컴패니언 개체가 '함수'에 암시 적 변환을 제공하는 것과 같은 기능을 수행하는지 궁금합니다. – Russell

+0

며칠 전이 동작을 발견했는데 나도 이상했습니다. –

4

을,이 작품 :

List(m1, m2, m3).map(ModelWrapper(_)) 
    List(m1, m2, m3).map(ModelWrapper.apply) 

컴패니언 개체가 생성되었으므로 사례 클래스로 보입니다. 컴파일러가 아니라 당신이, 당신이 ModelWrapper.apply을 말하는 것을 알고 있습니다. 동반자가있을 때, 동반자를 언급하고 있다고 생각합니다.

+0

예, 이것은 제가 겪고있는 문제의 핵심입니다. – Russell

관련 문제