2017-01-29 4 views
1

スカラと一致するパターンを作成したいのですが、オブジェクトが変数と同じ型かどうかを知りたいという問題があります。私はここでの問題を理解ケース節の変数とスカラパターンの一致

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

' role'とは何ですか? 「これ」って何? – Maxim

+0

ありがとうございました。これは、ユーザーの役割を検証する必要があるオブジェクトであり、役割は、ユーザーがリンクにアクセスするために必要な役割です。役割は抽象クラスであり、それを実装する2つのケースクラスがあります(今のところ、1つまたは2つ以上があると思います) – Motomine

答えて

1

ガードを使用して実行できます。結果を変数に割り当て、Booleanの状態を確認します。

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

しかし、私はこれを必要とするデザインを疑っています。

+0

ありがとう!私はそれを試みます。私が必要とするのは、ページにアクセスできるかどうかを知るためにユーザーの役割を確認することです。役割はここでパターンマッチングを使用するケースクラスです。 – Motomine

0

これは(それがroleを持っているのでthisは、タイプUserである)私はthis.roleのユーザーの役割

使用法は、このチェックはUserのメソッドの内部で起こることを意味し確認する必要が対象です。 user.role matchは、別のユーザーがいることを意味します。

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

あなたはまだしている場合は、次のように定義された

私はそのためにあなたの意図を知らない

が、与えられたRolethisを使用するよりも、別のオブジェクトのアクセス許可をチェックすることについては意味がありません。あなただけのメソッドに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 
    } 
} 
+0

完全な答えをありがとう!私はそれが私がやりたいことに対してより良いと思うので、ケースのオブジェクトを使って試しました。私の問題は、私は休止状態で私のモデルを維持しているし、私はオブジェクトを永続させることができないということです。それを行う方法があるかどうか知っていますか?ありがとうございました! – Motomine

関連する問題