2013-10-22 29 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

相关问题