Когда мне следует создавать методы с неявным аргументом в Scala?
Я сделал коды с использованием Play Framework в 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 ответ
Вы должны использовать неявные параметры, когда почти всегда есть "правильный" способ сделать что-то, и вы хотите игнорировать эти детали почти все время; или когда часто нет способа сделать что-то, и последствия предоставляют функциональность для тех вещей, которые работают.
Для примера первого случая, в scala.concurrent.Future
почти каждый метод принимает неявный ExecutionContext
, Вы почти никогда не заботитесь о том, ExecutionContext
от звонка к звонку; Вы просто хотите, чтобы это сработало. Но когда вам нужно изменить контекст выполнения, вы можете указать его как явный параметр.
Для примера второго случая, посмотрите на CanBuildFrom
в библиотеке коллекций. Вы не можете ничего построить из чего-либо; некоторые возможности предоставляются, и отсутствие неявного, скажем, позволяет упаковать кучу Vector[Option[String]]
с в HashSet[Char]
это один из основных способов сделать библиотеку мощной и гибкой, но в то же время разумной.
Вы не делаете ни одного: очевидно, вы просто используете это, чтобы сэкономить немного печатать в одном месте за счет другого места. И в этом случае, сделав это, вы сделали менее очевидным, как все работает, поскольку вам нужно искать повсюду, чтобы выяснить, где на самом деле используется этот неявный запрос. Если вы хотите сохранить типизацию, вам гораздо лучше использовать короткие имена переменных, но не забывайте об этом:
Action{ req => val name = MyCookie.getName(req).get; Ok("hello "+name) }