2014-10-07 2 views
8

나는 펑키 한 클로저 같은 물건을 만들고 싶다. 용기가 메서드의 매개 변수를 참조하는 익명 객체를 반환하는 메서드가 필요합니다. 여기가 내 의도를 설명 쓴 코드 :익명 개체를 반환하는 스칼라 함수?

object SessionManagement { 

    implicit class SessionManagementExtensions(val c : ChainBuilder) { 

    def set(dest: String) = object { 

     def from(src: String) = 
     c.exec(session => { 
      val list = session(src).as[Vector[String]] 
      val i = if (list.size == 0) -1 else Random.nextInt(list.size) 
      val value = if (i > 0) list(i) else "INVALID_" + dest 
      session.set(dest, value) 
     }) 

     def to[T](v: Expression[T]) = 
     c.exec(session => session.set(dest, v)) 

    } 

} 

가 난 할 노력하고있어 것은 나에게 다음 함께 호출을 체인 수있는 개체를 반환 "설정"하는 전화를 가지고있다가 ".TO "과 같이 :

.set(SOMETHING).to(OTHER) 

하지만

def foo = object { ... } 

난 후 나는 무엇을 얻기 위해 스칼라의 방법이 있나요 말할 수 없다? 클래스를 정의하고 인스턴스를 생성해야합니까?

+0

그래서'set'의 리턴 타입을'{def from (src : String) : Unit; def to [T] (v : Expression [T]) : Unit}'? –

답변

8

. 귀하의 구문은 거의 옳았다 : 단지 new에 의해 object 대체 :

def set(dest: String) = new { 
    def from(src: String) = 
    ... 

    def to[T](v: Expression[T]) = 
    ... 
} 

그러나,이 방법을 사용하여 반사를 사용해야합니다 호출 사이트의 구조 유형을 줄 것이다. 이를 방지하려면 개체의 API와 특성을 정의 : 나는 당신의 방법을 반환 무슨 생각을했습니다 때문에 내가 ReturnTypeOfFromReturnTypeOfSet을 사용

trait SetResult { 
    def from(src: String): ReturnTypeOfFrom 
    def to[T](v: Expression[T]): ReturnTypeOfTo 
} 

def set(dest: String): SetResult = new SetResult { 
    def from(src: String) = 
    ... 

    def to[T](v: Expression[T]) = 
    ... 
} 

참고. Btw, 이것은 나쁜 습관입니다 : public 메소드는 항상 명시 적 결과 유형을 가져야합니다.

+0

그게 알아서 했어. 감사! –

0

나는 무엇을하고 싶은지 잘 모르겠습니다. 잘하면이게 당신에게 출발점이 될 것입니다.
당신은 익명의 객체를 가질 수 있지만 내부 개체를 가질 수 있습니다, 그래서 당신은 할 수 있습니다 : 당신은 단순히 새로운 익명의 객체를 반환 할 수 있습니다

implicit class SessionManagementExtensions(val c: ChainBuilder) { 

    object MyInnerObject { 

    def from(src: String) = 
     c.exec(session => { 
     val list = session(src).as[Vector[String]] 
     val i = if (list.size == 0) -1 else Random.nextInt(list.size) 
     val value = if (i > 0) list(i) else "INVALID_" + dest 
     session.set(dest, value) 
     }) 

    def to[T](v: Expression[T]) = 
     c.exec(session => session.set(dest, v)) 

    } 

    def set(dest: String) = MyInnerObject 

} 
관련 문제