2015-12-15 52 views
1

隱式轉換假設我有以下方法:Scala的上整數

def main(args: Array[String]): Unit = { 
    println(Ring(2) + Ring(3) + Ring(-1) + Ring(10)) 
    } 

其產生:

([2]左>([-1]左>空值,右>空),右>([3]左> 空,右>([10]左>空值,右>空)))

我想要寫的隱式轉換,其允許我以下面的方式編寫代碼:

def main(args: Array[String]): Unit = { 
    val r :Ring = 2 + 3 + (-1) + 10 
    println(r) 
    } 

但以下隱式方法

implicit def intToRing(x :Int): Ring = { 
    new Ring(x) 
    } 

作品以這種方式該第一它總結了所有的元素,然後創建環什麼生產:

([14]左>空,right-> null)

是否可以實現'不貪心'隱式轉換whic小時會做我想要的?

+0

調用'main'時,您希望得到什麼結果? '環(14)'? –

+0

([2] left->([-1] left-> null,right-> null),right->([3] left-> null,right->([10] left-> null, > null))) –

+0

我不清楚'println(Ring(2)+ Ring(3)+ Ring(-1)+ Ring(10))'是如何打印的([2] left->([ -1] left-> null,right-> null),right->([3] left-> null,right->([10] left-> null,right-> null)))'。你能說更多嗎? –

回答

6

你應該能夠做到這一點通過明確鑄造第一INT:

val r = (2: Ring) + 3 + (-1) + 10 

這迫使編譯器尋找一個方式來增加「3」到Ring,應強制隱式轉換,否則它可以愉快地使用整數加法,而不需要尋找隱式轉換。

我能想到的這樣做將是提供Ring一個替代方法名的唯一的其他方式(直接,或通過隱式包裝類等),例如:

def +^(other: Ring): Ring = this + other 

和使用該運算符:

val r = 2 +^ 3 +^ (-1) +^ 10