2017-08-24 22 views
0

我是Scala编程的新手,并尝试创建Case-Match或Switch-Case语句,该语句根据输入值调用不同的函数。如何将函数名称传递给Scala中的Case-Match语句

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

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的返回类型成为“单元”而不是“字符串”。现在,这个错误被解决,但我收到以下错误消息

Error:(26, 22) forward reference extends over definition of value spark case "Value1"=> Function1(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 
} 

我通过保持火花变量的声明在代码的最后解决了这个错误。

+0

这个问题与Apache Spark有什么关系? – AKSW

+0

没有办法'case _ => println(..)'可以匹配预期的':String'返回类型 – cchantep

+0

@AKSW我认为我必须标记Apache Spark,并且每当我问到有关Scala的问题时。道歉,如果我错了 – JKC

回答

2

的问题是,你的Function1Function2(可怕的名字!)返回Unit,并getValue声明为返回一个String

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

这方面的一些部分可以省略,然后假定为默认值。 在你的情况下,你省略了ReturnType声明,并且(更重要的)=符号。当功能体之前没有=时,该功能将始终返回Unit。如果您希望它返回String,则需要在主体前添加一个=,并确保主体中的最后一条语句的确是String

此外,默认case子句不返回任何内容。这是行不通的,因为再次,getValue被宣布返回String。你需要在这种情况下抛出一个异常,或者想一个默认值返回(空字符串?),否则使用Options,就像其他答案所暗示的那样。

+0

Hi @Dima。感谢您的宝贵回应。我的函数不应该返回字符串。它应该执行一些操作。我的问题在于如何根据输入值导航到特定的函数体,这将是一个字符串值。我的要求是我必须在匹配语句的情况下传递这个字符串,然后它应该带我到特定的函数体。我修改了getValue定义来返回一个Unit。它仍然无法正常工作。更新了问题 – JKC

0

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

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 
    } 
+0

感谢您的回复。 Function1和Function2不应该返回字符串。它应该执行少量功能。 – JKC

相关问题