Scala如何使用Map将方法存储为值

时间:2014-11-21 01:05:51

标签: scala

我必须向用户提供一些选项,例如:

1. Option 1
2. Option 2
Please choose your option:

在我的scala代码中,每个选项都有自己的方法与之关联。例如:

def method1(){
 println("method1")
}

def method2(){
 println("method2")
}

我不想使用switch语句,而是使用这样的地图结构:

val option= Console.readInt
val options= Map(1 -> method1, 2-> method2 )

然后我想调用相应的方法:

options.get(option).get

然而,当它到达 val options = Map(1 - > method1,2-> method2)这一行时,会打印以下内容:

method1
method2

你能告诉我完成这个的指示吗?

谢谢,

1 个答案:

答案 0 :(得分:7)

您的方法可以使用或不使用括号来调用参数类型为()的方法。只需编写方法名称即可解析为方法调用。要将函数作为将调用方法的值,您可以使用_编写一个匿名函数作为()参数的占位符:

method1 _

在您的示例中,这将是

val options = Map(1 -> method1 _, 2 -> method2 _)
options.get(option).get()

括号在这里是必要的。它们似乎不像get方法那样。它们已应用于get返回的函数对象。

另请注意,您可以使用等效代码map.get(key).get替换map(key)

options(option)()

正如@tuxdna所指出的,如果option不是options地图中的某个键,则您的代码会抛出异常。避免这种情况的一种方法是对match

的结果执行options.get()
options.get(option) match {
   case Some(f) => f()
   case None => // invalid option selected
}