2014-03-24 63 views
3

我是假設,如果,在系統的某個地方,有一個值標記爲隱下:如何使用隱式值而不將它傳遞給函數?

implicit val moo = "World!" 

那麼它可能只是無論何時何地需要「憑空想象」?

這是正確的嗎?

所以,如果我現在有下面的代碼:

import Execution.Implicits._ 

def myFunc(stub:String)(implicit imp:String) = { 

    //the compiler now knows that imp should be the same as moo 
    println(stub + " " + imp) 

} 

myFunc("Hello") // <- should print "Hello World!" 

但是,我怎麼能避免必須實際定義函數的簽名爲採取隱?這意味着,在調用鏈中,我必須將其包含在與預期的暗示有用性不相符的參數中。我怎樣才能真正地「從空中摘下」?

感謝

回答

5

總之,你不能。

這裏是你的選擇:

轉發implicits

假設你有一個執行Future的功能,你需要一個ExecutionContext: 您可以import scala.concurrent.ExecutionContext.Implicits.global(或自定義等等)在如果你不想在日進口

import scala.concurrent.ExecutionContext.Implicits.global 
def someFun(): Future[SomeThing] = { 
    Future(something) 
} 

或者:同一個文件someFun,你會得到這個e與someFun相同的文件(類,對象等),則轉發該隱式。這樣,您可以在其他文件中使用someFun時將其導入。

def someFun()(implicit ex: ExecutionContext): Future[SomeThing] { 
    Future(someThing) 
} 

語境界定

聽起來這是你想要的,只有你沒有正確地執行它。

class Stub[T](name: String) 
def myFunc[T: Moo](stub: Stub[T]) = { 
    println(stub + " " + implicitly[Moo[String]]) 
} 

以上是等價的:

def myFunc[T](stub: T)(implicit evidence: Moo[T]) = { 
    println(stub + " " + evidence.toString) 
} 

查看邊界

或者,如果它更有意義隱式轉換StubMoo,而不是束縛:

def myFunc[T <% Moo](stub: T) = { 
    println(stub + " " + implicitly[Moo[T]]) 
} 

要使用上述內容,您需要提供物化含義(例如將存根轉換爲Moo的方法)。例如:

implicit def stubToMoo[T](stub: Stub[T]): Moo[T] = { 
    new Moo(stub) // or whatever 
} 

底線,在您的問題中使用implicits是沒有任何意義的。您可以按照您所描述的方式執行「精簡」導入,但根據上述選項,看看它是否值得。

0

那就沒有必要宣佈它implicit。考慮一下:

object B { 
    val moo = "World!" 
} 

... 

import B._ 

object A { 
    def myFunc(stub: String) { 
    println(stub + " " + moo) 
    } 
} 

myFunc("Hello") 
+0

重點是該值已被聲明爲隱式。我希望它是隱含的,因爲我不想回過頭幾英寸的代碼將它添加到調用鏈中每個函數的參數中。我給出的代碼不是實際的代碼,只是一個例子。 – Zuriar

+0

@ user3231690如果它是隱含的,您也可以直接訪問它 – serejja

+0

如何直接訪問它? – Zuriar

相關問題