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

2 回答 2

8

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

// object Fraction extends Function2[Int, Int, Fraction]
object Fraction extends ((Int, Int) => Fraction) {
  def apply(num: Int, den: Int) = new Fraction(num, den)
}
于 2013-10-22T16:55:57.950 回答
0

在任何情况下,您都必须实现相应的 apply 方法(apply(Int, Int): Fraction 在您的情况下)。如果您不想在对象 Fraction 中继承(如 Lex 所说),则以下代码也可以使用:

doFraction(Fraction.apply _)

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

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

于 2013-10-22T18:11:35.740 回答