2012-08-23 24 views
7

我有一個方法調用一些其他使用隱式的方法Foo。我想在Foo裏暗含f。這就是我要做的事:標記方法中隱含的參數

def myMethod(a: Int, f: Foo) = { 
    implicit val implicitF = f; 
    somethingThatNeedsFoo(a) 
} 

我不想慶祝f在myMethod的簽名隱含因爲FOOS不是正在使用myMethod的上下文的暗示。我的問題:有沒有比使用臨時變量更符合慣用(或簡潔)的方式來達到這種效果?

+2

在這個簡單的例子中,明確地傳遞'f'而不是使用implicits可能更容易 - 但是我假設你的真實代碼足夠複雜以使得隱含值得。在這種情況下,如果你想避免在方法簽名中隱含聲明參數本身,我認爲你在方法內聲明一個'implicit val'的解決方案是最好的方法。 – DaoWen

+0

@DaoWen你真的應該提交你的評論作爲答案。 –

+0

@Aaron Novstrup - 是的,看看我應該有的其他答案。我在這裏仍然很新,所以我仍然很難確定答案和評論的區別。 – DaoWen

回答

4

您可以顯式傳遞隱式參數,因此即使調用程序的隱式範圍中沒有Foo,調用程序也可以顯式傳遞它。

至於評論,你可以使用同樣的伎倆在富傳遞給somethingThatNeedsFoo

def myMethod(a: Int, f: Foo) = 
    somethingThatNeedsFoo(a)(f) 
6

我從來沒有見過這種實際使用,但你可以避開變量綁定到一個名稱。當然,使用下劃線:

implicit val _ = f 

雖然,我建議不要這種用法。

+0

建議不要這種用法的原因是什麼?我喜歡它避免了使用永遠不會使用的標識符污染本地名稱空間,並且代碼中的「噪音」更少。可能會導致編譯器錯誤混淆? –

+1

我認爲這可能會令人困惑,因爲下劃線也可能被視爲「完全忽略/禁用這種隱含的內容」。 (如'import Predef。{any2stringadd => _,_}'。) – Debilski

相關問題