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

发布于 2024-12-08 22:14:23 字数 545 浏览 0 评论 0原文

有两个简单的类以 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 扩展?与 Foo 相比,List(1,2,3) 映射 {new Bar(_)} 似乎更冗长一些。

Having two simple classes taking Int as an argument:

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

I can say:

List(1,2,3) map Foo

Which works fine and is equivalent to a bit more verbose:

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

However Bar (because it is not a case class?) cannot be used in the same construct:

List(1,2,3) map Bar

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

Is there some special syntax to reference any constructor and take advantage of eta expansion? List(1,2,3) map {new Bar(_)} seems a bit more verbose compared to Foo.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

浅浅 2024-12-15 22:14:23

它适用于前一种情况,因为案例类的伴生对象扩展了适当的 FunctionN 特征。 (在您的示例中,object Foo extends (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)

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

It works in the former case, because companion object of a case class extends appropriate FunctionN trait. (object Foo extends (Int => Foo) in your example.) For non-case classes, you could do this manually:

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 it's better to go with new Bar(_) as this extra boilerplate might not be worth the little concision achieved.

请你别敷衍 2024-12-15 22:14:23

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

Since Foo is a case class there is also a companion object called Foo, which implements the Function1 interface (had the constructor taken three arguments it would have been the Function3 interface).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文