6

我有一个案例类,它的构造函数有几个参数,我定义了一个随附的类对象,该对象定义了一个替代构造函数,该构造函数采用一组不同的参数,如下所示:

case class MyClass (c: Char, mc: List[MyClass]) 

object MyClass {
  def apply(c: Char, mc: MyClass): MyClass = {
    MyClass(c, List(mc))
  }
}

我想在 a 中使用原始案例类构造函数foldRight

object SomeStuff {
  def problem (s: String) {
    assert(!s.isEmpty)

    val zero = MyClass('a', Nil)

    val mc2 = "Pillsy Pillsy Pillsy" foldRight(zero) {
      MyClass(_, List(_))
    }
  }
}

当我这样做时,我从编译器收到一条错误消息:“MyClass 不接受参数。” 如果我注释掉该部分val mc2 = ...,这个问题就会消失,但MyClass显然是在zero. 我觉得我一定错过了一些非常基本的东西,但我不知道它是什么。我尝试了几种解决方法,比如定义一个辅助方法或一个函数值作为 的第二个参数foldRight,但都没有帮助,这并不奇怪,因为我基本上是在随机摸索。

4

1 回答 1

5

首先,foldRight接受两个参数,因此您不能使用运算符表示法(以其当前形式),但您可以:

("foo" foldRight zero) { ... }

或者,

("foo" :\ zero) { ... }

二、{ MyClass(_, List(_)) }将脱糖成

{ x => MyClass(x, y => List(y)) }

因此,您应该命名参数并使用new关键字来确保调用构造函数而不是apply方法:

"Pillsy Pillsy Pillsy".foldRight(zero) { (c, mc) =>
  new MyClass(c, List(mc))
}

apply或者如果您想使用下划线,请使用补充方法:

"Pillsy Pillsy Pillsy".foldRight(zero) { MyClass(_, _) }
于 2012-05-12T18:32:43.960 回答