Scala 在需要函数的地方使用构造函数

Scala 在需要函数的地方使用构造函数,scala,constructor,higher-order-functions,Scala,Constructor,Higher Order Functions,以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

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扩展<代码>列表(1,2,3)映射{newbar()}似乎比
Foo

更为详细,因为case类的伴随对象扩展了适当的
function。(
objectfoo扩展(在您的示例中为Int=>Foo)
)对于非case类,您可以手动执行此操作:

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)

在我看来,最好使用
newbar()
,因为这个额外的样板文件可能不值得实现一点简洁。

因为
Foo
是一个case类,还有一个名为
Foo
的伴生对象,它实现了
Function1
接口(如果构造函数有三个参数,它将是
Function3
接口).

Eta扩展发生在方法上。请注意,构造函数不是方法。@DanielC.Sobral什么是构造函数?@AshkanKh.Nazary构造函数是一系列指令,用于初始化新分配的对象。@DanielC.Sobral不是方法或函数?不能显式调用或传递它或者对其应用eta扩展以将其转换为函数?@AshkanKh.Nazary不,你不能。例如,尝试
new String.
。它在字节码级别上也不同,方法和构造函数之间的JVM期望值有各种不同。有趣的是,我不知道case类扩展了
function n
。我记得请记住一个答案,其中列出了case类的所有自动特性,但不记得提到的那个问题。case类没有。它们的伴生对象有。