9

有两个简单的类Int作为参数:

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)

IMO 最好使用,new Bar(_)因为这个额外的样板文件可能不值得实现一点简洁。

于 2011-10-08T08:20:26.783 回答
2

由于Foo是一个案例类,因此还有一个名为 的伴随对象Foo,它实现了Function1接口(如果构造函数采用三个参数,它将成为Function3接口)。

于 2011-10-08T08:30:52.197 回答