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(_)因为这个额外的样板可能不值得实现的小巧.
| 归档时间: |
|
| 查看次数: |
860 次 |
| 最近记录: |