函数中的Scala类型不匹配返回Double =>使用“return”关键字时的字符串

时间:2015-07-08 23:27:39

标签: scala

我有一个在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)
    }
  } 
}

4 个答案:

答案 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,你应该尽量避免使用它。 我希望这会有所帮助。