2012-04-15 21 views
3

考慮這種情況下類:使用明確的價值

case class IntPrinter(implicit val i: Int) { 
    def print()(implicit i: Int) = println(i) 
} 

我可以例如,它明確地傳遞一個值,像這樣的隱含參數:

val p = IntPrinter()(9) 

我在IRC中被告知,從現在起,明確通過的值將在被調用時被隱式傳遞以打印,但情況並非如此:

p.print() 
error: could not find implicit value for parameter i: Int 

我做錯了什麼或者我誤解了/被給出了不正確的信息?有什麼辦法可以做到這一點?


編輯:事實上它按預期工作的一個問題,如果我輸入p._這樣的:

import p._ 
p.print() 

這的確打印9

這是正確的行爲嗎?聽起來像使用import是個不好的主意嗎?我該如何解決這個問題?

+0

確保進口'的原因p._'的工作原理是因爲您只是將'case'類IntPrinter(隱式val i:Int)'帶入作用域。但是......這個「我」在課堂上已經是「範圍內」了;你不需要做任何特殊的事情來訪問它。 – Destin 2012-04-15 18:47:20

回答

1

確實這是正確的行爲。 implicit只在當前範圍內搜索值,並且在IntPrinter之外調用print意味着它不在類範圍(顯然)以及我不得不import它的原因。

做什麼,我想正確的方法:(因爲printProxy裏面IntPrinter的範圍)

case class IntPrinter(implicit val i: Int) { 
    def print()(implicit i: Int) = println(i) 
    def printProxy() = print() 
} 

,然後調用p.printProxy行爲就像我希望它表現

1

我不確定我是否理解。爲什麼你在這裏需要暗示?看來,你可以很容易地做到這一點:

scala> case class IntPrinter(i: Int) { def print() = println(i) } 
defined class IntPrinter 

scala> val p = IntPrinter(9) 
p: IntPrinter = IntPrinter(9) 

scala> p.print() 
9 

,或者,如果你真的有使用了IntPrinter採取隱式:

scala> case class IntPrinter(implicit val i: Int) { def print() = println(i) } 
defined class IntPrinter 

scala> val p = IntPrinter()(9) 
p: IntPrinter = IntPrinter(9) 

scala> p.print() 
9 

基本上,在這種情況下,你不需要指定它隱含兩次;當你第一次聲明它是隱含的,這使得i成爲該類的成員,所以你可以在整個類的其他部分繼續引用它 - 就像你可以使用類的任何其他數據成員一樣。

+0

這只是一個很小的例子,我的意思是使用它更復雜。無論如何,這是我的錯,我沒有表達我試圖達到的目標(請參閱我的回答。) – kaoD 2012-04-15 18:45:09

+0

@kaoD但是你的答案仍然沒有意義。爲什麼要打擾'printProxy'?爲什麼不直接訪問創建對象時已經提供的'i'?這就是'printProxy'所做的一切,無論如何...... – Destin 2012-04-15 18:50:04

+0

因爲,正如我所說的,這只是我想要實現的一個最簡單的例子。我想要構建一個DSL上的語法糖,它應該透明地處理一些隱式參數(並將它們透明地傳遞給它自己的新實例),而無需明確地訪問它們(爲了理智和代碼清晰)。必須僅在少數情況下,其餘時間必須隱形(正如我所說的,我期望DSL的清晰度。) – kaoD 2012-04-15 18:53:18