我有一个case类,它的构造函数有一些参数,我定义了一个附带的类对象,它定义了一个带有不同参数集的替代构造函数,如下所示:
case class MyClass (c: Char, mc: List[MyClass])
object MyClass {
def apply(c: Char, mc: MyClass): MyClass = {
MyClass(c, List(mc))
}
}
Run Code Online (Sandbox Code Playgroud)
我想在一个:中使用原始的 case类构造函数foldRight:
object SomeStuff {
def problem (s: String) {
assert(!s.isEmpty)
val zero = MyClass('a', Nil)
val mc2 = "Pillsy Pillsy Pillsy" foldRight(zero) {
MyClass(_, List(_))
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我这样做时,我从编译器收到一条错误消息:"MyClass不接受参数." 如果我注释掉这一部分,val mc2 = ...这个问题就会消失,但MyClass显然是在定义参数中zero.我觉得我必须遗漏一些非常基本的东西,但我不知道它是什么.我已经尝试了几个解决方法,比如定义辅助方法或函数值作为第二个参数foldRight,但没有一个有用,这并不太令人惊讶,因为我基本上随意地摸索.
首先,foldRight需要两个参数,因此您不能使用运算符表示法(以当前形式),但您可以:
("foo" foldRight zero) { ... }
Run Code Online (Sandbox Code Playgroud)
或者,
("foo" :\ zero) { ... }
Run Code Online (Sandbox Code Playgroud)
第二,{ MyClass(_, List(_)) }将desugar进入
{ x => MyClass(x, y => List(y)) }
Run Code Online (Sandbox Code Playgroud)
所以,你应该命名参数并使用new关键字来确保调用构造函数而不是apply方法:
"Pillsy Pillsy Pillsy".foldRight(zero) { (c, mc) =>
new MyClass(c, List(mc))
}
Run Code Online (Sandbox Code Playgroud)
或者apply如果你想使用下划线,请使用补充方法:
"Pillsy Pillsy Pillsy".foldRight(zero) { MyClass(_, _) }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3989 次 |
| 最近记录: |