2017-08-24 81 views
0

我要做到這一點,參數是懶惰的,可重複的:斯卡拉的名字重複參數

def f(actions: (=> Try[String])*) = { 
    actions.map{x => 
    if(x.isFailure) throw new Exception() 
    ... 
    } 
} 

所以,我可以用這個評估參數:

f(Try("a"), Try("b"), Try[String](new Exception()), Try({print("something"); "d"})) 

打印(「東西」 )永遠不會被執行,因爲參數是懶惰的。

而不是:

def f(actions: (() => Try[String])*) = ??? 
f(() => Try("a"),() => Try("b"),() => Try[String](new Exception()),() => Try({print("something"); "d"})) 

它只是書寫感覺無聊。
斯卡拉是否支持第一個?

回答

3

裹按名稱參數,像這樣:

implicit class ByNameWrapper[+A](a: => A) { def get: A = a } 

,並定義方法

def f(actions: ByNameWrapper[Try[String]]*) { 
    ... 
} 

用法是一樣的正常用名字參數:

f(Try { throw new Exception }, Try { println("a"); "b" }) 
+0

也許是目前唯一的解決方案。但我認爲如果語言支持它可能會更好。 – LoranceChen

1

這是要來點。或者它已經在dotty。

https://github.com/lampepfl/dotty/issues/499

+1

我認爲這是'=> A *'的錯誤。它被解釋爲'Function0 [Seq [A]]'(使用方法中的參數一次評估*所有參數)。 OP希望'Seq [Function0 [A]]',其中每個參數都是單獨評估的。 – HTNW

+0

@HTNW tl;博士我猜。語義不在scala中。 –

+0

對不起''(=> T)*',它只是一個'lazy val x:Seq [T]'。我實際上需要一個'val x:Stream [T]'。 – LoranceChen