在需要函数的地方使用构造函数
有两个简单的类以 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
它适用于前一种情况,因为案例类的伴生对象扩展了适当的 FunctionN 特征。 (在您的示例中,
object Foo extends (Int => Foo)
。)对于非 case 类,您可以手动执行此操作: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:IMO it's better to go with
new Bar(_)
as this extra boilerplate might not be worth the little concision achieved.由于
Foo
是一个案例类,因此还有一个名为Foo
的伴生对象,它实现了Function1
接口(如果构造函数采用三个参数,它将已经是Function3
接口)。Since
Foo
is a case class there is also a companion object calledFoo
, which implements theFunction1
interface (had the constructor taken three arguments it would have been theFunction3
interface).