2016-09-21 69 views
0

強調了輸入參數時,我有一個其中包含在那裏我試圖定義默認實現爲「空」的方法一般參數trait接受「缺少的參數類型」使用的功能文字

trait MetaBase[T <: Throwable] { 
    ... 
    def riskWithEvent[V](
    vToEvaluate: => V, 
    failureTEvent: FailureBase[T, V] => Unit = _ =>() 
): TryBase[T, V] = 
    ... 
} 

failureTEvent: FailureBase[T, V] => Unit =之後在下劃線收到「缺少的參數類型」的錯誤。我無法弄清楚如何讓Scala編譯器不必知道當前的類型信息,因爲它沒有被使用或需要。

我考慮改變參數:

failureTEvent: Option[FailureBase[T, V] => Unit] = None 

不過,我不喜歡這樣的客戶現在必須包裹它們的功能在Some()。我更願意讓他們不指定參數,或者指定沒有包裝器的參數。

對此有何指導意見是極大的讚賞。

+1

也許有FailureBase的變化做。無論如何,你都可以使用(_:Any)=>()。 –

+1

默認ARGS可能有其他危害:https://issues.scala-lang.org/browse/SI-7095 –

+0

的'(_:任意)=>()'編譯(我還有很多其他的代碼來獲得重構然後我可以聲稱它的工作)。我很困惑,爲什麼下劃線本身並不意味着同一件事;即Scala編譯器生成的任何代碼基本上應該是您確定的顯式形式。值得與Scala編譯器團隊打開一張票嗎? – chaotic3quilibrium

回答

3

其實,它與V PARAM麻煩。

這裏是-Ylog:typer -Ytyper-debug

| | | | | |-- ((x$1) =>()) : pt=FB[T,?] => Unit BYVALmode-EXPRmode (site: value g in MB) 
<console>:13: error: missing parameter type 
     trait MB[T <: Throwable] { def f[V](g: FB[T, V] => Unit = _ =>()): Unit =() } 
                   ^
| | | | | | \-> <error> => Unit 

或者,

scala> case class FB[T, V](t: T, v: V) 
defined class FB 

這工作:

scala> trait MB[T <: Throwable, V] { def f(g: FB[T, V] => Unit = _ =>()): Unit =() } 
defined trait MB 

這不:

scala> trait MB[T <: Throwable] { def f[V](g: FB[T, V] => Unit = _ =>()): Unit =() } 
<console>:13: error: missing parameter type 
     trait MB[T <: Throwable] { def f[V](g: FB[T, V] => Unit = _ =>()): Unit =() } 
                   ^

或只採取Any,因爲函數是禁忌變參數:

scala> trait MB[T <: Throwable] { def f[V](g: FB[T, V] => Unit = (_: Any) =>()): Unit =() } 
defined trait MB 

相關違約ARG打字其他鏈接:

https://issues.scala-lang.org/browse/SI-8884

https://issues.scala-lang.org/browse/SI-7095

Scala case class.type does not take parameters

+0

優秀的答案! Tysvm如此徹底。我知道你已經把它放在原帖的評論中了,但是......你是否介意在你的答案(底部,如果你喜歡)中加一個旁註來說明你打開的票子來覆蓋這個?這意味着閱讀答案的人將擁有所需的所有上下文,以瞭解爲什麼他們在這個切線上,並且將來可能會根據票證在Scala編譯器中進行修復。 Tysvm。 – chaotic3quilibrium

相關問題