문제

방법이 많이 있으며, 많은 암시 적 파라미터가 있습니다.

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.findByIdString => Option[User] 에있는 한 원하는 경우 다른 것에 일치시킬 수 있습니다.

다른 한편으로, User.findByIdString => 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)
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top