2017-01-29 41 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