2014-09-26 49 views
0

我要的是類似以下內容:在Scala中,類成員的參數返回類型,它是一個匿名函數

class Foo(val f: (Bar => A) => A) { 
    def consume(x: Int): Unit = { 
    val myStr: String = f(bar => bar.getStr) 
    val myInt: Int = f(bar => bar.getInt) 
    writeToLog(s"$myStr: ${myInt + x}") 
    } 
} 

我知道我可以通過定義類型爲f與應用方法做到這一點需要類型參數。我的問題是我可以在沒有定義這種類型的情況下實現這一目順便說一句,我不直接使用Bar,因爲每個Bar是一個rpc對象(例如節儉),並且我已經建立並拆除了我用這種模式避免的樣板代碼。

回答

0

我不知道,這正是你所需要的,但我可以用無形的建議態函數:

import shapeless._ 
    import poly._ 

    class Bar { 
    def getStr = "str" 
    def getInt = 1 
    } 

    type Extractor[T] = Bar => T 

    object extract extends Poly1 { 
    implicit def caseStr = at[Extractor[String]](f => f.andThen(identity)) 
    implicit def caseInt = at[Extractor[Int]](f => f.andThen(identity)) 
    } 

    class Foo(bar: Bar) { 
    def e[T](f: Bar => T): Extractor[T] = f 

    def consume(x: Int): Unit = { 
     val myStr: String = extract(e(_.getStr)) apply bar 
     val myInt: Int = extract(e(_.getInt)) apply bar 
     println(s"$myStr: ${myInt + x}") 
    } 
    } 

    new Foo(new Bar).consume(1) 

所以,你需要定義函數爲每個個案(字符串,整數等)。我只用身份。在你的例子中,你永遠不會通過酒吧,但你肯定需要它在某一點來計算字符串和國際

相關問題