2

我在 Play 2.4.6 中有以下模板定义块(使用 scala 2.11.6 和 sbt 0.13.8)我在以下代码中得到“缺少参数类型”:

@property(budgetId: Int, propertyName: String, value: String, shouldEdit: Boolean = false, displayMethod: Option[String => String] = None) = {
  <div>
    <label class="prop-name">@displayMethod.getOrElse(String => propertyName)(propertyName)</label>
    @shouldEdit ? editable(budgetId, routes.Budgets.update(budgetId), "input", propertyName, value) : <span>@value</span>
  </div>
}

@editable(id: Int, url: Call, inputType: String, name: String, value:String) = {
    <div class="editable"
        data-editable-input="@inputType" data-editable-url="@url"
        data-editable-id="@id" data-editable-property="@name" >@value</div>
}

任何人都知道为什么会这样?

4

1 回答 1

0

@displayMethod.getOrElse(String => propertyName)是问题所在。

String这里实际上是一个标识符,而不是 type String。所以你有一些带有参数 name String的函数,它的类型是未知的。编译器不会推断类型是String => String,因为Option#getOrElse有一个类型参数B >: A,这意味着它不必是String => String(只是在它的下方)。

您必须自己提供类型。最明确的方法是说:

@displayMethod.getOrElse((_: String) => propertyName)

现在我们声明一个显式的函数String => String,其中_代表我们不关心的单个参数。

于 2016-02-13T15:26:08.523 回答