scala中无法访问的代码
unreachable code in scala
val LIST = scala.collection.mutable.MutableList[String]()
val filterF = new Function[Path, Boolean] {
def apply(x: Path): Boolean = {
println("looking into " + x)
val flag = if (x.toString.split("/").last.split("_").last.toLong < System.currentTimeMillis) {
println("considered " + x)
LIST += x.toString
return true
} else {
println("NOT considered " + x)
return false
}
return flag
}
}
我正在尝试更新函数 filterF
内的外部变量 LIST
。但问题是 println("looking into "+x)
行的其余代码是无法访问的。
val flag = if (x.toString.split("/").last.split("_").last.toLong < System.currentTimeMillis) {
println("considered " + x)
LIST += x.toString
return true
} else {
println("NOT considered " + x)
return false
}
return flag
我不明白为什么无法访问此代码。代码中是否有某些字符实际上是造成这种情况的原因?
这是因为 flag
是 val 而不是 def,但是您的语句使用的是 return
return true 或 false。 return
关键字仅用于方法而不用于功能。
正确的方法可能是:
val flag = if (x.toString.split("/").last.split("_").last.toLong < System.currentTimeMillis) {
println("considered " + x)
LIST += x.toString
true
}
else {
println("NOT considered " + x)
false
}
不要使用return
当您使用 return
时,执行控制将离开函数,并且 return 语句之后的所有代码将无法访问
return 之后的代码将无法访问
def foo: Int = {
return 1
2 + 3 //unreachable
}
在 if 表达式的情况下
def bar: Int = {
if (true) {
return 1
} else {
return 2
}
1 + 2 //unreachable
}
在 Scala 中,return 语句是可选的,不推荐使用,因为它不考虑函数式编码实践。
The value of last expression in the code block is the return value in Scala. So don't worry about explicit return just leave it to the program
val flag = if (x.toString.split("/").last.split("_").last.toLong < System.currentTimeMillis) {
println("considered " + x)
LIST += x.toString
true //removed return
} else {
println("NOT considered " + x)
false // removed return
}
通过抛出异常或通过 returning 值或通过显式调用 exit 来停止程序执行不是功能性的做事方式。不幸的是,Scala 允许这样做。但是如果你想成为功能世界的好公民。你最好避免它。
避免可变集合
如果您有强烈的需求,请使用 mutable
集合。 immutable
合集有优势
1) 它们是线程安全的。
2) 没有错误(不会因意外突变和阻塞而感到惊讶)。
3) 引用透明度。
4) 合理的表现。
使用 immutable
列表而不是 mutable
列表。
使用 Scala lambda 表示法和语法糖
语法糖的存在是有原因的。语法糖减少了样板代码。让你的代码看起来更清晰、更干净、更好。有助于代码的可维护性。代码在更长时间内保持无错误。
而不是 Function1
特征使用 lambda 表示法。
scala> val f = new Function1[String, String] { def apply(str: String): String = str}
f: String => String = <function1>
scala> val f = {str: String => str}
f: String => String = <function1>
所以你的代码变成了
val paths = List[Path]() //assume you have Paths in it.
val filter = {path: Path => path.toString.split("/").last.split("_").last.toLong < System.currentTimeMillis }
val resultList = paths.filter(filter)
val LIST = scala.collection.mutable.MutableList[String]()
val filterF = new Function[Path, Boolean] {
def apply(x: Path): Boolean = {
println("looking into " + x)
val flag = if (x.toString.split("/").last.split("_").last.toLong < System.currentTimeMillis) {
println("considered " + x)
LIST += x.toString
return true
} else {
println("NOT considered " + x)
return false
}
return flag
}
}
我正在尝试更新函数 filterF
内的外部变量 LIST
。但问题是 println("looking into "+x)
行的其余代码是无法访问的。
val flag = if (x.toString.split("/").last.split("_").last.toLong < System.currentTimeMillis) {
println("considered " + x)
LIST += x.toString
return true
} else {
println("NOT considered " + x)
return false
}
return flag
我不明白为什么无法访问此代码。代码中是否有某些字符实际上是造成这种情况的原因?
这是因为 flag
是 val 而不是 def,但是您的语句使用的是 return
return true 或 false。 return
关键字仅用于方法而不用于功能。
正确的方法可能是:
val flag = if (x.toString.split("/").last.split("_").last.toLong < System.currentTimeMillis) {
println("considered " + x)
LIST += x.toString
true
}
else {
println("NOT considered " + x)
false
}
不要使用return
当您使用 return
时,执行控制将离开函数,并且 return 语句之后的所有代码将无法访问
return 之后的代码将无法访问
def foo: Int = {
return 1
2 + 3 //unreachable
}
在 if 表达式的情况下
def bar: Int = {
if (true) {
return 1
} else {
return 2
}
1 + 2 //unreachable
}
在 Scala 中,return 语句是可选的,不推荐使用,因为它不考虑函数式编码实践。
The value of last expression in the code block is the return value in Scala. So don't worry about explicit return just leave it to the program
val flag = if (x.toString.split("/").last.split("_").last.toLong < System.currentTimeMillis) {
println("considered " + x)
LIST += x.toString
true //removed return
} else {
println("NOT considered " + x)
false // removed return
}
通过抛出异常或通过 returning 值或通过显式调用 exit 来停止程序执行不是功能性的做事方式。不幸的是,Scala 允许这样做。但是如果你想成为功能世界的好公民。你最好避免它。
避免可变集合
如果您有强烈的需求,请使用 mutable
集合。 immutable
合集有优势
1) 它们是线程安全的。
2) 没有错误(不会因意外突变和阻塞而感到惊讶)。
3) 引用透明度。
4) 合理的表现。
使用 immutable
列表而不是 mutable
列表。
使用 Scala lambda 表示法和语法糖
语法糖的存在是有原因的。语法糖减少了样板代码。让你的代码看起来更清晰、更干净、更好。有助于代码的可维护性。代码在更长时间内保持无错误。
而不是 Function1
特征使用 lambda 表示法。
scala> val f = new Function1[String, String] { def apply(str: String): String = str}
f: String => String = <function1>
scala> val f = {str: String => str}
f: String => String = <function1>
所以你的代码变成了
val paths = List[Path]() //assume you have Paths in it.
val filter = {path: Path => path.toString.split("/").last.split("_").last.toLong < System.currentTimeMillis }
val resultList = paths.filter(filter)