2013-03-06 76 views
5

我做了Scala中使用遊戲框架,它看起來像下面的代碼:什麼時候應該在Scala中使用隱式參數創建方法?

object Application extends Controller { 
    def hoge = Action(implicit request => 
    val username = MyCookie.getName.get 
    Ok("hello " + username) 
    } 
} 

object MyCookie { 
    def getName(implicit request: RequestHeader) = { 
    request.cookies.get("name").map(_.value) 
    } 
} 

我從我的同事代碼審查。他說這個代碼因爲隱式參數而不可讀。我無法回覆他的意見。那麼你能告訴我什麼是使用隱式參數的最好方法嗎?什麼時候應該使用隱式參數?

+1

的可能重複(http://stackoverflow.com/questions/9530893 /隱式參數在斯卡拉好例子) – 2013-03-06 13:05:12

+0

謝謝布萊恩。你是對的。 – buster84 2013-03-06 13:16:12

回答

11

當幾乎總是有一個「正確」的方式來做事情時,你應該使用隱式參數,並且你幾乎想要忽略這些細節;或者當經常存在這樣的事情時,這些暗示爲那些工作提供了功能。

對於第一種情況的示例,在scala.concurrent.Future中,幾乎每種方法都採用隱式ExecutionContext。你幾乎從不關心你的ExecutionContext來自哪個電話;你只是想讓它工作。但是當你需要改變執行環境時,你可以將它作爲一個明確的參數提供。

有關第二種情況的示例,請查看集合庫中的CanBuildFrom。你無法從任何東西中建立任何東西;提供了某些功能,並且缺乏隱含的功能,比如說,可以讓您將一堆Vector[Option[String]]組合成一個HashSet[Char],這是保持庫功能強大且靈活而又健全的一種主要方式。

你既沒有這樣做:顯然你只是用它來節省一點點費用而不是另一個點。而且,在這種情況下,這樣做會讓事情變得不那麼明顯,因爲您必須到處查找才能確定隱式請求實際使用的位置。如果你想節省打字,你就要去使用短變量名,但顯式說明它更好:?在Scala中隱含參數的很好的例子]

Action{ req => val name = MyCookie.getName(req).get; Ok("hello "+name) } 
相關問題