2017-01-29 42 views
1

我想用scala做模式匹配,但我有问题想知道对象是否与变量类型相同。scala模式匹配case子句中的变量

我有这样的:

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

让我问你这个:“角色”是如何实现的?它是否具有有限数量的可能值? (你很可能想在这里定义一个'Role' ADT。) – Jubobs

+0

角色是什么?什么是'这个'? – Maxim

+0

谢谢你的答案。这是我必须验证用户角色的对象,角色是用户访问链接所需的角色。角色是一个抽象类,并且有两个案例类实现它(现在,我会考虑一个或两个) – Motomine

回答

1

您可以使用守卫:将结果分配给变量并检查任何Boolean条件。

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

但我是相当怀疑它需要这样的设计。

+0

谢谢!我会尝试。我需要的是验证用户的角色,以便知道它是否可以访问该页面。这里的角色是使用模式匹配的案例类。 – Motomine

0

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

this.role用法意味着此检查的User方法里面的对象(thisUser型的,因为它有一个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作为一个抽象类,而实际角色case类:

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 
    } 
} 
+0

谢谢你的完整答案!我尝试使用案例对象,因为我认为它对我想要做的事更好。我的问题是,我坚持我的模型休眠,我不能坚持的对象。你知道有没有办法做到这一点?谢谢! – Motomine