首先是问题:箭头反模式是Scala中的做事方式吗?
我已经从 Java 过渡到 Scala 大约 3 个月了。我开始将反箭头模式视为 Scala 中的一种标准。
例如,在 Java 中,我喜欢尽快从方法中返回。我们不喜欢很多内部嵌套。如果你有很多,它被称为箭头反模式。你可以在这里阅读:http ://c2.com/cgi/wiki?ArrowAntiPattern
Java 示例:
boolean isValid(String input){
if (input.trim().length() <1) return false //return early
if (input.substring(0,3).equals("sth")) return false;
//do some more checks for validity then return true
return true
}
如果我在 Scala 中编写此代码,我将不得不使用匹配大小写语句,这会导致大量缩进。请记住,这只是一个虚拟示例,我尝试仅传达 Scala 的嵌套和缩进。
def isValid(input:String): Boolean = {
(input.trim.length < 1) match {
case true =>
input.substring(0,3) match {
case sthCase if(sthCase=="sth") =>
//do some more checks etc
//eventually arrive at the "true" branch
... case valid => true
case sthElse if (sthCase=="bla") => //some more code etc
case _ => false
}
case _ => false
}
}
我知道这个例子的编写方式可能与我编写 Java 的方式相同,但是如果我不想返回 true 或 false 我想将该值分配给一个变量,即:val valid = (input.trim.length < 1) match ...
那么这是唯一的方法,因为你不能重新分配给 val。我可以使用var
而不是val
,但我会使用 Java 而不是 Scala。
问题,重申:
所以问题是,箭头反模式是在 Scala 中做事的方式还是我错过了什么?在 Scala 中是否有更好的方法来完成我刚刚编写的内容(请记住,我希望将匹配语句结果分配给val
变量)。