2013-10-22 33 views
1

大小寫類可以作爲函數傳遞,我怎樣才能讓一個普通類以同樣的方式作爲函數傳遞?爲什麼大小寫類可以作爲函數傳遞

case class Fraction(val num: Int, val den: Int) 

object Run extends App { 
    def doFraction(in: (Int, Int) => Fraction) {} 

    doFraction(Fraction) 
} 

上面的代碼工作,我如何修改下面的代碼以獲得相同的效果?

class Fraction(val num: Int, val den: Int) { 
    /* what can I put here or in companion object to make this compile? */ 
} 

object Fraction { 
    /* ... */ 
} 

object Run extends App { 
    def doFraction(in: (Int, Int) => Fraction) {} 

    doFraction(Fraction) 
} 

回答

8

你的同伴對象需要擴展功能特點,並具有規定的適用()方法:

// object Fraction extends Function2[Int, Int, Fraction] 
object Fraction extends ((Int, Int) => Fraction) { 
    def apply(num: Int, den: Int) = new Fraction(num, den) 
} 
0

在任何情況下,你必須執行相應的應用方法(申請(INT,INT):分數在你的情況)。如果你不想在目標級繼承(如萊克斯說的),下面的代碼將工作太:

doFraction(Fraction.apply _)

Fraction.apply _ Fraction.apply方法會將你的函數類型(Int,Int)=>分數

至於case類,您可以查看生成的字節碼並查看伴隨對象的生成的類已經擴展(Int,Int)=> Fraction。 還有一些細微之處 - 請看這個細節:https://groups.google.com/forum/#!msg/scala-user/ZhSDMJgwghc/DZpbzvVYHXIJ

相關問題