2012-08-13 54 views
13

我有點疑惑問心無愧這階:問題return語句

下面的代碼編譯確定:

def save: Action[AnyContent] = Action { 
    if (1 == 2) { 
    BadRequest(toJson("something went wrong")) 
    } else { 
    Ok(toJson(Feature.find)) 
    } 
} 

,但如果我只是添加了return語句,我得到如下:

def save: Action[AnyContent] = Action { 
    if (1 == 2) { 
    return BadRequest(toJson("something went wrong")) 
    } else { 
    return Ok(toJson(Feature.find)) 
    } 
} 

[error] found : play.api.mvc.SimpleResult[play.api.libs.json.JsValue] 
[error] required: play.api.mvc.Action[play.api.mvc.AnyContent] 
[error]  return BadRequest(toJson("something went wrong")) 

我認爲這兩個代碼就等於......

BTW,行動是一個同伴對象,與一個應用方法,接收函數的形式:Request [AnyContent] =>結果,並返回一個Action [AnyContent]

看起來像使用return語句,塊返回直接執行BadRequest的結果。 ..和好的...而不是將傳遞塊的結果返回到Action對象伴侶...

對不起,對嗎?

注:我試圖找到擺脫這麼多的嵌套的地圖和getOrElse的

PS的方式:對不起,如果這個問題有點迷惑,我很困惑自己...

回答

11

這兩個表達式的確做了非常不同的事情!

def save: Action[AnyContent] = Action { 
    if (1 == 2) { 
    BadRequest(toJson("something went wrong")) 
    } else { 
    Ok(toJson(Feature.find)) 
    } 
} 

這裏,save將返回Action(Ok(toJson(Feature.find)))結果。現在,

def save: Action[AnyContent] = Action { 
    if (1 == 2) { 
    return BadRequest(toJson("something went wrong")) 
    } else { 
    return Ok(toJson(Feature.find)) 
    } 
} 

這裏的情況比較複雜。當return Ok(toJson(Feature.find))被評估時,它將從save返回!也就是,Ok(toJson(Feature.find))不是傳遞給Action。相反,方法save的執行將停止,並且Ok(toJson(Feature.find))將作爲其結果返回 - 但這不是save應該返回的類型,所以它會給出類型錯誤。

記住:return從封閉def返回。

+0

感謝丹尼爾,我發現你說的難道...有沒有從函數無條件退出的相同方式?也就是說,我希望返回值在傳遞給Action的塊中進行評估...... – opensas 2012-08-14 06:48:15

+2

@opensas您可以將函數定義爲「def」,然後將其作爲參數傳遞給「Action」。 – 2012-08-14 17:07:07

+0

**記住:從封閉的def **返回返回值,請你解釋一下是什麼意思? – 2013-12-17 05:05:07

4

您使用的方法在Action同伴對象確實定義,但它是不是你在你的問題描述了一個,而是:

def apply (block: ⇒ Result): Action[AnyContent] 

的參數(block)的類型結果的表達式,這將被評估經緯度呃按需(名義評估)。它不是一個函數或閉包,只是一個表達。所以你不能從表達式中得到return

順便說一下:在Scala中使用return是一種代碼異味,應該避免。

+0

我不知道函數和表達式之間的區別,我會爲它谷歌...順便說一句,也許你可以幫助我解決這個問題,那是什麼開始它的一切:http://stackoverflow.com/問題/ 11929235/scala-style-how-to-avoid-lots-ne-nested-map – opensas 2012-08-13 07:16:16

+1

@opensas你應該檢查的區別是「函數」與「按名稱參數」。一個名字叫做'=>'。 – paradigmatic 2012-08-13 07:21:24

+2

@paradigmatic所以你要說的是'return'需要包含'method'類型的值(Action [AnyContent]'類型的方法'save'),而不是'Action'所期望的類型(這是'Result'類型,或者編譯器報告'SimpleResult')。換句話說,「你不能從表達式返回」,但你可以(並且編譯器試圖)從方法返回。有道理,謝謝。 – 2012-08-13 08:29:17