2014-10-07 19 views
8

Ben korkak kapatma gibi şeyler yapmak istiyorum. Bağırsakları, yöntemin parametrelerini referans alan bir anonim nesneyi döndürmek için bir yöntem istiyorum. İşte bu benim niyet göstermektedir yazdı kodudur:Anonim bir nesneyi veren Scala işlevi?

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)) 

    } 

} 

Ne yapmaya çalışıyorum beni sonra birlikte bir çağrı için zincirle sağlayan bir nesne döndürmesi "set" için bir çağrısı olduğunu" .to " şöyle:

.set(SOMETHING).to(OTHER) 

Ama

def foo = object { ... } 

Ben sonra neysem almak için Scala'da bir yolu var mı söyleyemeyiz? Bir sınıf tanımlamalı ve onu başlatmalı mıyım?

+0

Yani '{def (: String src): uzak olmak set'' dönüş türünü istediğiniz Birimi; [T] için def (v: İfade [T]): Birim} '? –

cevap

8

. Kişisel sözdizimi neredeyse haklıydı: sadece new tarafından object değiştirin:

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

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

Ancak bu yöntemleri kullanmaya yansıması kullanmak zorunda kalacak çağrı yerinde bir yapısal türünü verecektir. Bunu önlemek için, nesnenin API ile bir özelliği tanımlar: Ben senin yöntemleri dönmek fikrim yok çünkü ReturnTypeOfFrom ve ReturnTypeOfSet kullanılan

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]) = 
    ... 
} 

Not. Btw, bu kötü bir alışkanlıktır: Kamu yöntemleri her zaman açık bir sonuç türüne sahip olmalıdır.

+0

Bu onunla ilgileniyordu. Teşekkürler! –

0

Umarım bu başlangıç ​​noktası verecektir size ne yapmak istediğinizi emin değilim.
Anonim nesne olamaz ama iç nesneleri olabilir, bu nedenle yapabilirsiniz: Sadece yeni bir anonim nesne döndürebilir

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 

} 
İlgili konular