如何将函数名称传递给Scala中的Case-Match语句

时间:2017-08-24 11:54:03

标签: scala

我是Scala Programmaing的新手并尝试创建Case-Match或Switch-Case语句,该语句根据输入值调用不同的函数。

例如,请参阅示例代码段。希望它能解释我打算做什么

def getValue(x: Any):String = x match {
case "Value1"=> Function1(int)
case "Value2"=> Function2(int)
case _ => println("This is an invalid value")
}

def Function1(int) {
    Do Something
}

def Function2(int) {
    Do Something
}

当我这样给出时,我收到的错误如下所示:

Error:(26, 34) type mismatch;
 found   : Unit
 required: String
      case "Value1"=> Function1(int)

已编辑: 将getValue的返回类型修改为“Unit”而不是“String”。现在此错误已解决,但我收到以下错误消息

  

错误:(26,22)前向引用扩展了值的定义   火花         case“Value1”=>功能1(INT)

修改后的代码段

def getValue(x: Any):Unit = x match {
case "Value1"=> Function1(int)
case "Value2"=> Function2(int)
case _ => println("This is an invalid value")
}

def Function1(int) {
    Do Something
}

def Function2(int) {
    Do Something
}

我通过在代码末尾保留spark变量的声明来解决这个错误。

2 个答案:

答案 0 :(得分:3)

问题是,您的Function1Function2(可怕的名字!)返回Unit,而getValue被声明为返回String

函数声明看起来像def functionName(args): ReturnType = { ... }

可以省略其中的某些部分,然后假设默认值。 在您的情况下,您省略了ReturnType声明,(更重要的是)=符号。当函数体之前没有=时,函数将始终返回Unit。如果您希望它返回String,则需要在正文之前添加=,并确保正文中的最后一个语句确实是String

此外,默认的case子句不会返回任何内容。这不起作用,因为再次声明getValue返回String。你需要在这种情况下抛出异常,或者想要返回一个默认值(空字符串?),或者使用Options,就像其他答案所示。

答案 1 :(得分:1)

Function1和Function2应该返回字符串。另外,你不能使用println,因为它的结果是Unit,在这种情况下,你可以抛出异常:

  def getValue(x: Any):Unit = x match {
    case "Value1"=> function1(1)
    case "Value2"=> function2(2)
    case _ => throw new IllegalArgumentException("This is an invalid value")
  }

  def function1(v: Int): String = {
      // SOME STUF THAT RETURNS STRING
  }

  def function2(v: Int): String = {
     // SOME STUF THAT RETURNS STRING
  }