0

我有以下代码:

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

怎么了?

4

1 回答 1

3

请记住:Scala 是静态类型的。

当您创建 (outer)时,Scala 会根据您放入的内容Map推断出类型。actions最严格但仍然匹配的类型(所谓的最小上限)是:

Map[String,Map[String,Object]]

所以 aMap映射StringsMaps那个映射StringsObjects。因此,当您检索任何元素时,它将是 type Object,而不是Function您不能调用它。

您应该使用案例类:

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)
于 2013-05-06T17:09:11.073 回答