我应该何时在Scala中使用隐式参数创建方法?
我使用
scala中的play框架创建了代码,如下所示:
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) } } 我收到了同事的代码审查.他说这个代码因隐式参数而无法读取.我无法回复他的意见.那么你能告诉我使用隐式参数的最佳方法是什么?我何时应该使用隐式参数? 解决方法
当几乎总是以“正确”的方式执行操作时,您应该使用隐式参数,并且您希望几乎始终忽略这些细节;或者当经常无法做任何事情时,暗示为那些有效的事物提供功能.
对于第一种情况的示例,在scala.concurrent.Future中,几乎每个方法都采用隐式ExecutionContext.你几乎从不关心你的ExecutionContext从调用到调用是什么;你只是想让它发挥作用.但是当您需要更改执行上下文时,您可以将其作为显式参数提供. 有关第二种情况的示例,请查看集合库中的CanBuildFroms.你不能从任何东西建造任何东西;提供了某些功能,并且缺少一个隐含的,比如说,允许你将一堆Vector [Option [String]]打包成一个HashSet [Char],这是保持库强大而灵活而且理智的一种主要方式. 你没有做任何事情:显然你只是用它来节省一点点打字而牺牲另一点.而且,在这种情况下,这样做会使事情变得不那么明显,因为你必须遍布整个地方找出实际使用隐式请求的位置.如果你想保存输入,你最好使用短变量名,但要明确它: Action{ req => val name = MyCookie.getName(req).get; Ok("hello "+name) } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |