패턴 경기 내에 암시 적입니다
-
10-12-2019 - |
문제
방법이 많이 있으며, 많은 암시 적 파라미터가 있습니다.
def hello(message:String)(implicit a:A,b:B,c:C, ..., user: User) = {...}
.
이제 그러한 수업을 고려하십시오 :
object Users extends Controller {
implicit a: A = ...
implicit b: B = ...
...
def index(id:String) = Action {
User.findById(id) match {
case Some(user) => {
implicit val _user = user
hello("implicit")
}
case _ => BadRequest
}
}
}
.
위의 샘플 에서이 줄을 볼 수 있습니다.
implicit val _user = user
.
객체를 암시 적 오브젝트로 만드는 것만으로 존재합니다.그렇지 않으면 user
를 다음과 같이 호출해야합니다.
hello("implicit")(a,b,c,... user)
.
코드를 개선 할 수있는 방법이 있는지 생각하고 있습니다.우리는 hello
변수를 정의 할 필요가 없지만 _user
가 암시 적으로 만들 수 있습니다.
해결책
예, _user
암시 적으로 암시 적으로 생성하는 동안 user
변수를 제거하는 방법이 있습니다.
def index(id:String) = Action {
User.findById(id) map (implicit user => hello("implicit")) getOrElse BadRequest
}
.
업데이트 : 아래 의견의 많은 경우에 대한 질문을 해결합니다.
모두 User.findById
에 의해 반환되는 값 유형에 따라 다릅니다.Option[User]
가 있지만 특정 사용자와 일치하도록 원하는 경우 (User
가 사례 클래스 인 경우) 원래 솔루션은 여전히 적용됩니다.
.
def index(id:String) = Action {
User.findById(id) map { implicit user =>
user match {
case User("bob") => hello("Bob")
case User("alice") => hello("Alice")
case User("john") => hello("John")
case _ => hello("Other user")
}
} getOrElse BadRequest
또는 User.findById
가 String => Option[User]
에있는 한 원하는 경우 다른 것에 일치시킬 수 있습니다.
다른 한편으로, User.findById
가 String => User
이면 다음과 같이 도우미 객체를 정의 할 수 있습니다.
.
object withUser {
def apply[A](user: User)(block: User => A) = block(user)
}
다음과 같이 사용하십시오 (다시 User
가 사례 클래스 인 경우) :
.
def index(id: String) = Action {
withUser(User findById id) { implicit user =>
user match {
case User("bob") => hello("Bob")
case User("alice") => hello("Alice")
case User("john") => hello("John")
case _ => BadRequest
}
}
}
또는 다른 값에 대한 일치, Int
:
.
def index(id: String, level: Int) = Action {
withUser(User findById id) { implicit user =>
level match {
case 1 => hello("Number One")
case 2 => hello("Number Two")
case 3 => hello("Number Three")
case _ => BadRequest
}
}
}
이 옵션이 당신이 가질 수있는 모든 시나리오를 다루기를 바랍니다.
다른 팁
케이스 Some(implicit user)
와 같은 트릭을 알고 있지만 는 어떨까요?
def hello(message: String, user: User)(implicit a: A, ... z: Z) = ...
def hello(message: String)(implicit a: A, ... z: Z, user: User) = hello(message, user)
case Some(user) => hello("implicit", user)
.