Scala Play的奇怪情况 - 类型推断

时间:2014-01-07 23:30:27

标签: scala playframework playframework-2.0

@(css: Option[String])(content: Html)(customJS: Option[Array[String]])

 @for(js <- customJS if !customJS.isEmpty) {
            <script src="@routes.Assets.at(js)"></script>
        }

我正在为这个小小的理解而写作,它将循环并打印出uri String。由于可能是none或一个字符串数组,我使用了Option

然后来自类型安全激活器的编译器告诉我,@routes.Assets.at()应该是String而不是Array[String]。我很震惊,因为js应该是String对吗?

然后我试着这样写:

 @for(js <- customJS if !customJS.isEmpty) {
      @var uri = js
            <script src="@routes.Assets.at(js)"></script>
        }

然后编辑说,增加的行是“简单表达”的非法开始。

这不是一个简单的表达!这是{}的完全理解!此外,我最终被迫使用js.asInstanceOf[String]来欺骗编译器。我对此并不高兴,因为一旦我被告知我永远不应该使用asInstanceOf。那我的原始代码有什么问题?

1 个答案:

答案 0 :(得分:1)

请注意,您不应使用Array - 使用Seq

Option[Seq[String]]无需使用Seq[String]。而不是None,您可以始终使用空Seq

如果您仍想使用Option[Seq[String]],则应该像这样重写for

@for(jsArray <- customJS; js <- jsArray) {
  <script src="@routes.Assets.at(js)"></script>
}

您不需要if !customJS.isEmptyOption类似于带有1或0个元素的集合。 Option[Array[String]]的元素为Array[String]

相关问题