我是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变量的声明来解决这个错误。
答案 0 :(得分:3)
问题是,您的Function1
和Function2
(可怕的名字!)返回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
}