我有scala地图:
attrs: Map[String , String]
Run Code Online (Sandbox Code Playgroud)
当我尝试迭代地图时;
attrs.foreach { key, value => }
Run Code Online (Sandbox Code Playgroud)
以上不起作用.在每次迭代中,我必须知道什么是关键,什么是价值.使用scala语法糖迭代scala map的正确方法是什么?
我想知道为什么使用Kestrel放弃代码的副作用部分是如此有用.有没有人有这方面的经验?并且可以解释真正的动机以及它如何帮助到底.
虽然我知道Pure函数编程是关于零方效应的,因此可以更好地调试和预测代码.但是对于Kestrel来说,我看不出它真的有帮助吗?
最好,
MM-
什么是惯用的打印方式(或做任何我需要做的事情)并在Scala中返回值?例如,
Seq(1,2,3)
.map(_ * 2)
.xxx(println) // Here I want to print the intermediate sequence
.foldLeft(0)(_ + _)
Run Code Online (Sandbox Code Playgroud)
我能想到的一种方法是使用隐式但我真的不喜欢自己修补标准库.
在Ruby中我们可以使用 Object#tap
[1,2,3]
.map { |i| i * 2 }
.tap { |i| puts i }
.reduce(0) { |x, i| x += i }
Run Code Online (Sandbox Code Playgroud) 我试图丰富所有TraversableOnce [String]对象,我无法找出构建迭代器的正确语法.这是我到目前为止:
class Exclaimer[R <: TraversableOnce[String]](val lines:R) {
import scala.collection.generic.CanBuildFrom
def exclaim(implicit bf:CanBuildFrom[R,String,R]):R = {
val b = bf(lines)
lines.foreach(b += _)
b.result
}
}
implicit def WrapExclaimer[R <: TraversableOnce[String]](lines:R) = new Exclaimer(lines)
Run Code Online (Sandbox Code Playgroud)
它适用于集合(即它返回与我给它相同的类的集合),但它不适用于迭代器,因为它Cannot construct a collection of type Iterator[java.lang.String] with elements of type String based on a collection of type Iterator[java.lang.String].我该如何解决?我正在使用Scala 2.9(编辑:我错误地写了2.8).
这是一些示例输出:
scala> List("a","b","c").exclaim
res5: List[java.lang.String] = List(a, b, c)
scala> Vector("a","b","c").exclaim
res6: scala.collection.immutable.Vector[java.lang.String] = Vector(a, b, c)
scala> List("a","b","c").iterator.exclaim
<console>:10: error: Cannot construct a collection …Run Code Online (Sandbox Code Playgroud)