scala模式与case子句

时间:2017-01-29 19:43:21

标签: scala design-patterns matching

我想与scala进行模式匹配,但我有问题,我想知道该对象是否与变量的类型相同。

我有这个:

user.role match {
  case this.role.getClass => true //here says stable identifier required, but this.role.getClass found
  case _: Role_Admin => true
  case _ => false
}

我理解这里的问题,但我需要将它与存储在实例中的变量相匹配。有没有办法做到这一点?或者有人知道其他任何好方法吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

您可以使用警卫执行此操作:将结果分配给变量并检查任何Boolean条件。

user.role match {
  case role if role.getClass == this.role.getClass => true
  case _: Role_Admin => true
  case _ => false
}

但我对需要这种设计的设计非常怀疑。

答案 1 :(得分:0)

  

这是我必须验证用户角色的对象

this.role的使用意味着此检查发生在User的方法中(this属于User类型,因为它有role)。 user.role match表示您有其他用户。

我不知道你的意图,但鉴于Role定义如下:

trait Role {}
case object Admin extends Role
case object Guest extends Role

你可以拥有User和这样的方法:

case class User(role: Role) {
  def hasAccess(user: User): Boolean = 
    user.role match {
      case this.role => true
      case Admin => true
      case _ => false
    }
}

如果您仍在讨论检查其他对象的权限,而不是使用this,则没有任何意义。您只需将User传递给方法并仅检查该用户:

object PermissionChecker {
  def hasAccess(user: User): Boolean = user.role match {
    case Admin => true
    case Guest => true
    case _ => false
  }
}

注意:在您的情况下,似乎更容易使用特征和案例对象来建模Role。但是如果你写的那样你有Role作为抽象类,而实际角色作为案例类:

abstract class Role {}
case class Admin() extends Role
case class Guest() extends Role

比想法保持不变,但你必须稍微调整一下语法:

case class User(role: Role) {
  def hasAccess(user: User): Boolean = user.role match {
    case this.role => true
    case _: Admin => true
    case _ => false
   }
}

具有单独对象的变体:

object PermissionChecker {
  def hasAccess(user: User): Boolean = user.role match {
    case _: Admin => true
    case _: Guest => true
    case _ => false
  }
}