Scala从map调用lambda
我有以下代码:Scala从map调用lambda,scala,Scala,我有以下代码: val actions = Map( "index" -> Map( "description" -> "Makes CAEServer index project with provided project_id " , "usage" -> "index project_id" , "action" -> ( (args: Array[String]) => { if (checkSecondArgument(a
val actions = Map(
"index" -> Map(
"description" -> "Makes CAEServer index project with provided project_id "
, "usage" -> "index project_id"
, "action" -> (
(args: Array[String]) => {
if (checkSecondArgument(args, "Project ID wasn't specified. Please supply project ID.")) {
new CAEServer(args{0}).index(args{2})
}
}
)))
actions{providedAction}{"action"}(args)
当我试图编译它时,编译器说
error: MainConsole.this.actions.apply(providedAction).apply("action") of type java.lang.Object does not take parameters
[INFO] actions{providedAction}{"action"}(args)
[INFO] ^
[ERROR] one error found
怎么了?记住:Scala是静态类型的 当您创建(外部)
映射时,Scala会根据您在其中输入的内容推断操作的类型。最严格但仍然匹配的类型(称为最小上界)是:
所以一个映射
将字符串映射到映射
的映射
将字符串映射到对象
。因此,当您检索任何元素时,它的类型将是对象
,而不是函数
,因此您无法调用它
您应该使用案例类:
case class ActionElement(
description: String,
usage: String,
action: Array[String] => CAEServer)
val actions = Map("index" -> ActionElement(
"Makes CAEServer index project with provided project_id ",
"index project_id",
args => { if (checkSecondArgument(args, "Project ID wasn't ...")) {
new CAEServer(args{0}).index(args{2})
}
))
现在您可以拨打:
actions(providedAction).action(args)
记住:Scala是静态类型的
当您创建(外部)映射时,Scala会根据您在其中输入的内容推断操作的类型。最严格但仍然匹配的类型(称为最小上界)是:
所以一个映射
将字符串映射到映射
的映射
将字符串映射到对象
。因此,当您检索任何元素时,它的类型将是对象
,而不是函数
,因此您无法调用它
您应该使用案例类:
case class ActionElement(
description: String,
usage: String,
action: Array[String] => CAEServer)
val actions = Map("index" -> ActionElement(
"Makes CAEServer index project with provided project_id ",
"index project_id",
args => { if (checkSecondArgument(args, "Project ID wasn't ...")) {
new CAEServer(args{0}).index(args{2})
}
))
现在您可以拨打:
actions(providedAction).action(args)
这可能是因为操作的类型为Map[String,Map[String,Any]]
其中Any
不带参数。这可能是因为操作的类型为Map[String,Map[String,Any]]
其中Any
不带参数。