案例类构造函数看似虚假的"不带参数"错误

Pil*_*lsy 6 scala case-class

我有一个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,但没有一个有用,这并不太令人惊讶,因为我基本上随意地摸索.

4e6*_*4e6 5

首先,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)