0

기존 라이브러리 (생성자 또는 컴패니언 객체를 편집 할 수 없음)로 작업 할 때 종종 객체에서 init/setup 프로 시저를 호출 한 다음 반환해야합니다. 객체 그 자체. 나는 보통 다음과 같은 일을한다.부작용 처리 : 체인 생성자와 설정 메소드의 도우미 기능

def createObject: MyObject = { 
    val o = new MyObject 
    o.init() 
    o 
} 

이 이럴 하지 매우 우아하고, 예를 들어,이 일을 더 나은 방법이 있는지 궁금하네요하는 설치 및-수의 라인을 따라 기능 : (내 자신의 작성 이외의)

def createObject: MyObject = { 
    setupAndGet(new MyObject) { _.init(v) } 
} 

스칼라에서이에 대한 기존 솔루션이 있습니까?

+1

이것은 "기능 스타일"이 아닙니다. 'o.store'는 부작용에 의해 작동하므로 스칼라에서 원하는 것을 수행하는 방법을 찾을 수 없을 것입니다. –

답변

2

글쎄, 각 스칼라 케이스 클래스는이 정확한 서명을 가진 apply 메서드를 가진 생성 된 컴패니언 개체와 함께 제공됩니다.

.apply() 방법은 기본 메서드 호출입니다
scala> case class Foo(s:String) 
defined class Foo 

scala> Foo.apply("hello") 
res1: Foo = Foo(hello) 

주, 당신은 단순히 다음은 당신이 원하는 것을 할 수있다 Foo("hello")

1

쓸 수 있습니다.

def applyAndGet(myObject: MyObject)(f: myObject.type => Unit): myObject.type = { 
    f(myObject) 
    myObject 
} 

그러나 나는 new MyObject(value)과 같은 생성자를 호출하는 것이 좋습니다.

+0

그게 효과가 있지만 사용자 정의 함수를 작성하지 않고 가능한 "기본 제공"방법을 찾고있었습니다. – Snps

1

는 (그들에 대한 많은 정보, 당신은 그들이 무엇인지 모른다면 바로 구글이있다) 다음과 같은 확장 방법을 고려하십시오

implicit class SetupExtension[T](private val t: T) extends AnyVal { 
    def setup(code: T => Any): T = { 
    code(t) 
    t 
    } 
} 
val s: MyObject = new MyObject.setup(_.setXProperty(???)) 

이 방법을 사용하면 일부 변경 가능한 API를 사용하여 작업하는 매우 유용한입니다 (자바 라이브러리 등에서). 그 외에는 이런 식으로 일하는 것을 권하지 않습니다.