对于这里的FP认知来说,这看起来真的很明显,但Scala中的点自由风格有什么用呢?在这个主题上真正卖给我的是一个插图,它显示了点自由风格在某些方面(例如性能,优雅,可扩展性,可维护性)如何在非点自由风格中解决相同问题的代码.
将值与列表的第n个元素匹配的最佳Scala习惯用法是什么?
天真的方法显然不起作用:
scala> val list = List(5,6,7)
list: List[Int] = List(5, 6, 7)
scala> val x = 7
x: Int = 7
scala> x match { case list(2) => true; case _ => false }
<console>:10: error: value list is not a case class constructor, nor does it have an unapply/unapplySeq method
x match { case list(2) => true; case _ => false }
Run Code Online (Sandbox Code Playgroud)
为了澄清 - 这个问题不是关于如何将值与列表的第n个元素进行比较 - 具体是关于是否可以使用匹配来完成.
我知道在Scala中不推荐使用case类继承,但为了简单起见,我在下面的例子中使用了它:
scala> case class Foo(val f: String) { def foo(g: String): Foo = { this.copy(f=g) }}
defined class Foo
scala> case class Bar(override val f: String) extends Foo(f)
warning: there were 1 deprecation warnings; re-run with -deprecation for details
defined class Bar
scala> Bar("F")
res0: Bar = Foo(F)
scala> res0.foo("G")
res1: Foo = Foo(G)
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.但是,我真正想要的是能够foo()在Foo中编写一个方法,当在类型为Bar的对象上调用时返回Bar类型的对象,而不必重新实现类Bar中的方法.有没有办法在Scala中执行此操作?