6

コンストラクター用のいくつかのパラメーターを持つケース クラスがあり、次のように、別の引数セットを取る代替コンストラクターを定義する付随するクラス オブジェクトを定義します。

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

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

で元のケースクラスコンストラクターを使用したい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。本当に基本的な何かが欠けているように感じますが、それが何であるかわかりません。の2番目の引数として使用するヘルパーメソッドまたは関数値を定義するなど、いくつかの回避策を試しましたfoldRightが、どれも役に立ちません。基本的にランダムにいじっているので、それほど驚くことではありません。

4

1 に答える 1

5

まず、foldRight2 つの引数を取るため、(現在の形式では) 演算子表記を使用できませんが、次のことができます。

("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 に答える