使用构造函数所在的函数

Tom*_*icz 8 constructor scala higher-order-functions

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

case class Foo(i: Int)
     class Bar(j: Int)
Run Code Online (Sandbox Code Playgroud)

我可以说:

List(1,2,3) map Foo
Run Code Online (Sandbox Code Playgroud)

哪个工作正常,相当于更冗长:

List(1,2,3) map {Foo(_)}
Run Code Online (Sandbox Code Playgroud)

但是Bar(因为它不是案例类?)不能在同一个构造中使用:

List(1,2,3) map Bar

  error: not found: value Bar
          List(1,2,3) map Bar
                          ^
Run Code Online (Sandbox Code Playgroud)

是否有一些特殊的语法来引用任何构造函数并利用eta扩展?List(1,2,3) map {new Bar(_)}与...相比似乎有点冗长Foo.

mis*_*tor 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)
Run Code Online (Sandbox Code Playgroud)

IMO最好随身携带,new Bar(_)因为这个额外的样板可能不值得实现的小巧.

  • 有趣的是,没有意识到案例类扩展了`FunctionN`.我记得一个SO答案,其中列出了案例类的所有自动功能,但不记得提到的问题. (2认同)