2012-10-11 90 views
1
val flag = false 

if (val data = flag) { 
    println(data) 
} 

是否有可能在012語句中分配flag並在Scala中自動評估?斯卡拉如果條件內分配

+3

爲什麼要編寫這樣的代碼?在'if'的主體內部,'data'總是'true',那麼爲什麼你需要'val data'呢? – Jesper

+0

更新了我的問題 – Ryan

+5

現在還很不清楚,你試圖在這裏實現什麼。不要將'data'分配給'flag'的值,你可以使用標誌,這在範圍內。請澄清你想要做什麼。 – drexin

回答

4

是,但它不逃避的範圍,所以你不能在體內使用它,如果

if ({val data = true; data}) 
    println("data was true") 

的分配不會返回一個值,但可以改爲返回。更好地做類似

def test(data: Boolean) { 
    if (data) {/* data in scope */} 
    else  {/* data in scope */}} 
+0

從你的第一個示例代碼中,是否有可能在整個if區塊中使用'data'? – Ryan

+0

不幸的是,它只在大括號內部,如果你需要分配和測試然後在'if'的主體中使用,那麼看起來你應該聲明一個'var'(這需要一個拋棄分配)在包含'if'的外部範圍中。然而,使用'var's更重要的是能夠分配,測試然後在'if'條件部分的範圍中使用。 –

3

有一個很好的擴展功能,可以幫助你與你的情況和其他許多人。

implicit class AnyExtensions[A](val x: A) extends AnyVal { 
    def asSatisfying(p: A => Boolean): Option[A] = 
    if (p(x)) Some(x) else None 
} 

有它的範圍進口的,你可以做你的榜樣如下:你可以用下面的隱式轉換實現它

flag.asSatisfying(_).foreach(println) 

有一些更好的用例爲它詳細解釋this answer

該函數的主要優點是它可以讓您有效地消除引入中間變量的需要,從而使您能夠將任何「if-else」邏輯解決爲單行表達式。