2014-01-07 57 views
1
@(css: Option[String])(content: Html)(customJS: Option[Array[String]]) 

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

我正在寫這個小的理解,將通過並打印出uri字符串。由於它可能不是,或者是一串字符串,所以我使用了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

請注意,您不應使用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]

+0

我看到了!這就是爲什麼!!但那個「簡單表達」的非法開始呢? –

+0

@WindDweller:我猜'@ var'只是非法的陳述。我無法在[documentation]中找到它(http://www.playframework.com/documentation/2.2.x/ScalaTemplates)。你可以使用'@definition'。你也可以在'for'中添加一個額外的變量:'@for(jsArray < - customJS; js < - jsArray; otherName = js)'。 – senia

+0

Emmm ..對不起,我試圖使用'Seq',但它告訴我:錯誤:值foreach不是對象的成員Seq –