为什么case类可以作为函数传递

时间:2013-10-22 16:49:55

标签: scala

案例类可以作为函数传递,我怎样才能使普通类以相同的方式作为函数传递?

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

2 个答案:

答案 0 :(得分:8)

您的伴侣对象需要扩展Function trait并定义apply()方法:

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

答案 1 :(得分:0)

在任何情况下,您都必须实现相应的apply方法(apply(Int,Int):在您的情况下为Fraction)。如果你不想在对象Fraction中继承(正如Lex所说),下面的代码也会起作用:

doFraction(Fraction.apply _)

Fraction.apply _将Fraction.apply方法转换为类型(Int,Int)=>的函数。分数

对于案例类,您可以查看生成的字节码,看看伴随对象的生成类是否已经扩展(Int,Int)=>分数。 还有一些细微差别 - 详情请看:https://groups.google.com/forum/#!msg/scala-user/ZhSDMJgwghc/DZpbzvVYHXIJ