我有一個表達式返回一個對象,並且我想只在某個布爾條件爲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))
是否真的值得所有迂迴到避免臨時值? (你不需要使用var,只需要一個if/else。) – 2013-04-05 02:12:16
@RandallSchulz當然不一定。但理想情況下,我想避免顯式類型信息*和*涉及臨時值的冗長解決方案! sschaef如下所示,如果前向管道操作員可用,這是可能的。 – 2013-04-05 14:36:13
對於我來說,看到所提供的替代方法如何比您在問題中展示的最簡單的形式(第一種)更可取。 – 2013-04-05 14:51:00