9

Int引数として2つの単純なクラスを持つ:

case class Foo(i: Int)
     class Bar(j: Int)

私は言うことができます:

List(1,2,3) map Foo

これは正常に機能し、もう少し冗長に相当します。

List(1,2,3) map {Foo(_)}

ただしBar、(ケースクラスではないため?)同じ構成で使用することはできません。

List(1,2,3) map Bar

  error: not found: value Bar
          List(1,2,3) map Bar
                          ^

コンストラクターを参照し、eta拡張を利用するための特別な構文はありますか?List(1,2,3) map {new Bar(_)}に比べて少し冗長に見えFooます。

4

2 に答える 2

12

前者の場合は、ケースクラスのコンパニオンオブジェクトが適切なFunctionN特性を拡張するため、機能します。(object Foo extends (Int => Foo)あなたの例では。)ケース以外のクラスの場合、これを手動で行うことができます。

scala> class Bar(i: Int)
defined class Bar

scala> class Bar(i: Int); object Bar extends (Int => Bar) { def apply(i: Int) = new Bar(i) }
defined class Bar
defined module Bar

scala> List(2, 3) map Bar
res17: List[Bar] = List(Bar@1f99e90, Bar@1191056)

new Bar(_)この余分なボイラープレートは、少し簡潔にするだけの価値がない可能性があるため、IMOを使用することをお勧めします。

于 2011-10-08T08:20:26.783 に答える
2

はケースクラスであるため、インターフェイスを実装する、Fooというコンパニオンオブジェクトもあります(コンストラクターが3つの引数をとった場合、それはインターフェイスでした)。FooFunction1Function3

于 2011-10-08T08:30:52.197 に答える