1

以下のコードは、リスト型とケース クラスの 2 つの実装を定義し、1 つは空のリストを表し、Cons は実際のリストを作成します

sealed trait List[+A]
case object Nil extends List[Nothing]
case class Cons[+A](head: A, tail: List[A]) extends List[A]

object List {
  ...
  def apply[A](as: A*): List[A] = {
    if (as.isEmpty) Nil
    else Cons(as.head, apply(as.tail: _*))
  }
  val example = Cons(1, Cons(2, Cons(3, Nil)))
}

が実行されたときに、上記の再帰的な適用メソッドによってリストが作成されるという私の仮定は正しいですval example = ...

もしそうなら。コンスを作成するためCons(head, tail)の署名は、適用の署名が互換性がないvariad def apply[A](as: A*): List[A]場合、scalaが実際にどのように推測するval exampleかですList(1, 2, 3, Nil)

4

1 に答える 1

1

あなたが言う時

class Foo(s: String, i: Int)

scala では、 と を受け取るFooコンストラクターを持つクラスを生成StringIntます。

これは、次のように宣言された Java クラスとほとんど同じです。

public class Foo {
   public Foo(String s, int i) {
       ...
   }
}

ケース クラスを使用すると、コンパイラはコンパニオン オブジェクトなどの追加機能applyを、コンストラクタと同じパラメータを受け取る既定のメソッドとともに提供します。

Cons(head, tail)そのため、コンストラクターを明示的に定義せずにを直接呼び出すことができます。

于 2014-09-28T15:02:00.570 に答える