2013-04-04 54 views
3

我有一個表達式返回一個對象,並且我想只在某個布爾條件爲true的情況下調用結果對象的方法。我想在val中得到結果(對象,或調用對象的方法的結果)。有條件地調用沒有臨時變量的成員函數

的一種方式是使用一個臨時變量,如在下面的例子中,其中List(3, 1, 2)是(潛在複雜)表達返回一個對象,list是臨時var和.sorted是我希望有條件地調用的方法:

import scala.util.Random 

val condition = Random.nextBoolean 
val result = {  
    var list = List(3, 1, 2); 
    if (condition) list = list.sorted 
    list 
} 

什麼是規範的方式做到這一點,用一個臨時變量也許沒有

注意

if (condition) List(3, 1, 2).sorted else List(3, 1, 2) 

是不太令人滿意的,因爲List(3, 1, 2)一般可以,我不想重複一個複雜的表達式。

這是一個方法,我發現,不幸的是涉及給予明確的類型(是不是引入如上一個臨時變量更長,更復雜):

val condition = Random.nextBoolean 
val result = 
    (
    if (condition) 
     {l: List[Int] => l.sorted} 
    else 
     identity(_: List[Int]) 
).apply(List(3, 1, 2)) 

我猜想一定有,我有一個整潔的方式未能認出。

更新:一個稍微不那麼難看的方法,不幸的是仍需要明確的類型信息:

val condition = Random.nextBoolean  
val result = { 
    l: List[Int] => if (condition) l.sorted else l 
    }.apply(List(3, 1, 2)) 
+2

是否真的值得所有迂迴到避免臨時值? (你不需要使用var,只需要一個if/else。) – 2013-04-05 02:12:16

+0

@RandallSchulz當然不一定。但理想情況下,我想避免顯式類型信息*和*涉及臨時值的冗長解決方案! sschaef如下所示,如果前向管道操作員可用,這是可能的。 – 2013-04-05 14:36:13

+0

對於我來說,看到所提供的替代方法如何比您在問題中展示的最簡單的形式(第一種)更可取。 – 2013-04-05 14:51:00

回答

9

可以使用去路管操作:

implicit class PipedObject[A](value: A) { 
    def |>[B](f: A => B): B = f(value) 
} 

scala> List(3, 1, 2) |> (xs => if (true) xs.sorted else xs) 
res1: List[Int] = List(1, 2, 3) 
+0

啊!我想知道在Scala中是否存在這樣的「後綴函數應用程序」操作符。 (任何想法,如果它將內置在某個點?) – 2013-04-04 23:09:06

+0

我不知道,但目前沒有討論將其包括到stdlib。 – sschaef 2013-04-04 23:11:09