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) を作成するとMap、Scala はactionsそこに入力した内容に基づいて の型を推測します。最も制限的ですが、それでも一致するタイプ (いわゆる最小上限) は次のとおりです。

Map[String,Map[String,Object]]

そのため、MapそのマップStringsにマップされる a が にマップさMapsれます。そのため、要素を取得すると、それは typeになりますが、呼び出せないわけではありません。StringsObjectsObjectFunction

ケース クラスを使用する必要があります。

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 に答える