IT干货网

scala之模式匹配中的隐式

third_qq_4accc0ab0fa5b582 2024年11月01日 编程设计 5 0

我有一个方法,有很多隐式参数:

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作为:
hello("implicit")(a,b,c,... user) 

我在想是否有任何方法可以改进代码,例如我们不需要定义 _user变量,但使 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 
    } 
  } 
} 

我希望这涵盖了您可能遇到的所有情况。


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!