Martin Odersky的书"Scala编程"讲述了避免有副作用的方法.例如,以下方法具有写入标准输出流的副作用.
def printArgs(args: Array[String]): Unit = {
args.foreach(println)
}
Run Code Online (Sandbox Code Playgroud)
然后它说,更好的方法是定义一个格式化传递的args进行打印的方法,但只返回格式化的字符串,如:
def formatArgs(args: Array[String]) = args.mkString("\n")
Run Code Online (Sandbox Code Playgroud)
我不明白这两种方法在概念上是如何不同的.总之,我们的目标是打印一个字符串.如果我们不在目标方法中这样做,那么客户端代码会这样做,这意味着我们只是转移代码导致从一个地方到另一个地方的"副作用".
我有一个 A 类,它包含一个 B 类的选项(比如 b),它可以是 None。B 里面有一个字符串值(比如 str),我需要提取它,它的默认值是一个空字符串。所以基本上如果 b 是 None,我需要得到空字符串。
a.b.getOrElse(B).str
Run Code Online (Sandbox Code Playgroud)
所以,在这里我需要创建一个 B 的实例。这可以避免吗?
我必须根据 Seq 的大小做出决定。
所以,要么我可以这样做:
if(mySeq.size() > 0) // do your stuff
Run Code Online (Sandbox Code Playgroud)
或者,我可以这样做:
mySeq match {
case x :: _ => // do your stuff
}
Run Code Online (Sandbox Code Playgroud)
我应该更喜欢哪一个?
我必须根据模式匹配块中的情况执行一些操作,但仅限于选择性情况,其余情况无需执行任何操作。那么剩下的情况就直接 return() 就可以了吗?像这样的东西:
val x = ....
val y = ....
(x, y) match {
case (Some(number), Some(text)) => {
......
}
case (Some(number), None) => {
......
}
case (_, _) => () // do nothing
}
Run Code Online (Sandbox Code Playgroud)