7

按照Play 2.0 documentation上object.member匹配,模式匹配可以在像這樣的模板來完成:模式中播放2.0模板

@connected match { 

    case models.Admin(name) => { 
    <span class="admin">Connected as admin (@name)</span> 
    } 

    case models.User(name) => { 
    <span>Connected as @name</span> 
    } 
} 

的情況下的表達式後的括號內的文本將被視爲輸出(例如HTML),這非常方便。

然而,試圖使用一個匹配表達式不是一個簡單的變量,如object.member,這樣當:

@album.year match { 
    case Some(y: Int) => { @y } 
    case None => { <b>nope</b> } 
} 

它導致一個編譯錯誤: "')' expected but 'case' found."

使用defining表達式綁定到一個簡單的變量,就像這樣:

@defining(album.year) { foo => 
    @foo match { 
     case Some(y: Int) => { @y } 
     case None => { <b>nope</b> } 
     } 
    } 

的作品,但它似乎有點cumb ersome。

在涉及對象和成員的表達式(例如album.year)上是否有適當的方式使用此模式匹配功能?

+0

確實 @(album.year匹配{ 的情況下的一些(Y:強度)=> {@y} 情況下無=> {都能跟得上} }) 或 @(album.year)匹配{ 一些情況下(Y:強度)=> {@ y} case None => {nope} } 工作嗎? – axaluss

+0

不,這些都不起作用。第一個結果是「預計開始定義」,第二個結果與上述相同「」)「期望...」錯誤。 – kes

+0

@@ album.year match {case Some(y:Int)=> {@y} case None => {noope}}}工作嗎? – axaluss

回答

0

您是否嘗試過這樣做?

@album.year.getOrElse("<b>None</b>"); 

不知道它是否如此簡單,但它應該工作。請參閱https://github.com/playframework/Play20/blob/master/samples/scala/computer-database/app/views/list.scala.html#L64

+0

我知道這是解決在我的問題中出現的簡單示例的一種可能的替代方法...但是,該示例僅用於說明問題,即Play中的模式匹配要麼不完全工作,要麼不按預期工作。 – kes

2

你試過嗎?

@album.year match { 

    case Some(y: Int) => { 
    @y 
    } 
    case None => { 
    <b>nope</b> 
    } 
} 

在這裏看到一個例子:https://github.com/bjartek/computer-database-mongo/blob/matchtest/app/views/list.scala.html#L67

看起來空白是非常重要的是得到模板

+0

好吧,剛剛用調整好的空格試了一下。它仍然不起作用。你的例子和我的區別在於你的匹配表達式是一個簡單的標識符(@company),而我的是@ object.member。 – kes