案例类可以作为函数传递,我怎样才能使普通类以相同的方式作为函数传递?
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)
}
答案 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