Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala从map调用lambda_Scala - Fatal编程技术网

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
不带参数。