2010-11-10 41 views
4

以下example from 斯卡拉之旅顯示了基於類型如何使用隱式提供適當的缺失成員(add和unit)。編譯器將在範圍內選擇正確的隱式對象。該庫也使用List.sortByOrderingList.sumNumeric隱式參數的有效用法

然而是在B類以下使用隱式參數的一個有效/推薦的使用(相對於不使用A類隱含的):

class I 

class A { 
    def foo(i:I) { bar(i) } 
    def bar(i:I) { baz(i) } 
    def baz(i:I) { println("A baz " + i) } 
} 
(new A).foo(new I) 

class B { 
    def foo(implicit i:I) { bar } 
    def bar(implicit i:I) { baz } 
    def baz(implicit i:I) { println("B baz " + i) } 
} 
(new B).foo(new I) 

在哪裏我主要使用隱式對自己保存一些打字在調用站點上傳遞參數時。

+1

雖然根據語言規則有效,但我個人不會在這些情況下使用暗示。我會用它們: 1)根據調用環境改變方法的行爲。 2)對調用取決於周圍類的類型參數或方法本身。 但是,這只是我個人的看法,何時以及如何使用它們。也許還有其他有效和有用的模式。 – axel22 2010-11-10 16:36:20

回答

3

這是一個很好的用例。實際上,當範圍決定要使用的參數時,我推薦這樣做。它提供了一種優雅的方式將某種上下文傳遞給Plugin類,以便實用程序函數將使用該上下文。例如:

trait Context 

object UtilityLib { 
    def performHandyFunction(implicit x : Context) : SomeResult = ... 
} 

trait Plugin { 
    def doYourThing(implicit ctx : Context) : Unit 
} 

class MyPlugin extends Plugin { 
    def doYourThing(implicit ctx : Context) : Unit = { 
    UtilityLib.performHandyFunction 
    } 
} 

SomePluginAPI.register(new MyPlugin) 

你可以看到在database migration system I was toying的例子。查看Migration類和它的MigrationContext。

+0

是的,我可以看到這是如何有用。引發這個問題的用例是沿着這些線的,但我沒有想到「上下文」這個詞...... – huynhjl 2010-11-11 00:43:45

2

它看起來並不像一個慣用的implicits,它傾向於適用於類型類和依賴注入。絕對沒有點在經過大約不帶任何成員的一類...

這也是比較常見的進行調用,以(new B).foo

之前定義I類型的隱式VAL或對象說了這麼多,您所提供這顯然是一個非常抽象的例子。因此,想象一個合理的使用情況下的相似模式的含義是不難的。