我想与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
}
我理解这里的问题,但我需要将它与存储在实例中的变量相匹配。有没有办法做到这一点?或者有人知道其他任何好方法吗?
谢谢!
答案 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
}
}