我有一个在Scala中返回Double => String
函数的函数。当我在函数末尾添加return
时,我得到type mismatch
:
type mismatch; found : String required: Double ⇒ String
为什么会这样?在Scala中,return
纯粹是不可选的吗?在这种情况下,当我删除两个return
时,一切都很好,但是如果我想在那之前返回if / else,我会怎么做?
def createBuckets(start: Double, end: Double, gap: Double): Double => String = {
var buckets: List[String] = List[String]()
val endPoints: List[Double] = List[Double]()
var first = start
var second = gap
while (second < end) {
buckets ::= first + " to " + second
first = second
second += gap
}
if (first != end) {
buckets ::= first + " to " + end
}
buckets = buckets.reverse
println("BUCKETS: " + buckets)
val range = end - start
(input: Double) => {
val bucket = (input / gap).floor.toInt
if (input == end) {
// Type mismatch from this return
return buckets(buckets.size - 1)
} else {
// and this one
return buckets(bucket)
}
}
}
答案 0 :(得分:3)
以下是错误的简化版本:
def foo: Int => Int = { x => return x } //error
请注意,return
仅用于方法定义。它通常在匿名函数中无效。如果您尝试声明val
而不是:
val foo: Int => Int = { x => return x }
//error: return outside method definition
您可以阅读更多有关方法与功能之间差异的信息here。
即使在方法体中,return
在Scala中几乎总是单一的,通常也可以避免。如果要在最终if-else
之前返回,可以将整个块包装在另一个if-else
中,或者实例化val
并将表达式的最后一个语句设为val
(例如{ val x = 5; ...; x }
)。
答案 1 :(得分:3)
如果由于某种原因要求返回:
def outer(): Int => String = {
def f(i: Int): String = { if (i < 0) return "BAD" ; "hello" take i }
f
}
你唯一的想法就是想要返回一个带有最小样板的函数。
这只是一个编译器错误,但它很有趣:
object X { def f(i: Int = return 42) = i * 2 }
答案 2 :(得分:2)
memset()
从return
返回,而不是您的匿名函数。因此类型错误。现在,正如其他答案中所述,在您的情况下,您可以简单地删除它:
def
您不需要提前返回语句,并且通常您可以构造任何代码以具有单个返回点。
例如,命令式语言中的常见模式:
if (input == end) {
buckets(buckets.size - 1)
} else {
// and this one
buckets(bucket)
}
这可以改写为:
def sillyExample(input) {
if (input.isBad) {
return None
}
//some complex operations go here
return Some(complexResult);
}
这并不复杂。快乐路径代码的额外缩进级别可能很烦人(并且可以通过更高级的功能抽象来解决,但我离题了),但是你很快就会习惯它。没有任意def sillyExample(input) {
if (input.isBad) {
None
} else {
//some complex operations go here
Some(complexResult);
}
}
语句,而是专注于表达式的优点是它使您更接近参考透明度
答案 3 :(得分:1)
您应该删除返回关键字,因为它们强制从createBuckets函数返回结果,并且您会收到类型不匹配错误,因为返回的类型是String(存储桶),而不是Double到String的函数。 使用return关键字不是惯用的scala,你应该尽量避免使用它。 我希望这会有所帮助。