我有一個方法調用一些其他使用隱式的方法Foo
。我想在Foo裏暗含f。這就是我要做的事:標記方法中隱含的參數
def myMethod(a: Int, f: Foo) = {
implicit val implicitF = f;
somethingThatNeedsFoo(a)
}
我不想慶祝f
在myMethod的簽名隱含因爲FOOS不是正在使用myMethod的上下文的暗示。我的問題:有沒有比使用臨時變量更符合慣用(或簡潔)的方式來達到這種效果?
我有一個方法調用一些其他使用隱式的方法Foo
。我想在Foo裏暗含f。這就是我要做的事:標記方法中隱含的參數
def myMethod(a: Int, f: Foo) = {
implicit val implicitF = f;
somethingThatNeedsFoo(a)
}
我不想慶祝f
在myMethod的簽名隱含因爲FOOS不是正在使用myMethod的上下文的暗示。我的問題:有沒有比使用臨時變量更符合慣用(或簡潔)的方式來達到這種效果?
您可以顯式傳遞隱式參數,因此即使調用程序的隱式範圍中沒有Foo,調用程序也可以顯式傳遞它。
至於評論,你可以使用同樣的伎倆在富傳遞給somethingThatNeedsFoo
:
def myMethod(a: Int, f: Foo) =
somethingThatNeedsFoo(a)(f)
我從來沒有見過這種實際使用,但你可以避開變量綁定到一個名稱。當然,使用下劃線:
implicit val _ = f
雖然,我建議不要這種用法。
建議不要這種用法的原因是什麼?我喜歡它避免了使用永遠不會使用的標識符污染本地名稱空間,並且代碼中的「噪音」更少。可能會導致編譯器錯誤混淆? –
我認爲這可能會令人困惑,因爲下劃線也可能被視爲「完全忽略/禁用這種隱含的內容」。 (如'import Predef。{any2stringadd => _,_}'。) – Debilski
在這個簡單的例子中,明確地傳遞'f'而不是使用implicits可能更容易 - 但是我假設你的真實代碼足夠複雜以使得隱含值得。在這種情況下,如果你想避免在方法簽名中隱含聲明參數本身,我認爲你在方法內聲明一個'implicit val'的解決方案是最好的方法。 – DaoWen
@DaoWen你真的應該提交你的評論作爲答案。 –
@Aaron Novstrup - 是的,看看我應該有的其他答案。我在這裏仍然很新,所以我仍然很難確定答案和評論的區別。 – DaoWen