2017-01-02 2 views
3

私はこのケースクラスをパターンマッチングで使用できると読んでいます。しかし、私はパターンマッチングでも正規のクラスを使用することができます。 This questionは、通常のスケーラのパースペクティブを提供します。私はこの特定のコードのためにスカラーだけでなくakkaの観点からもそれを望んでいます。たとえば :Akkaのケースクラスについて特別なものは何ですか?

Actorクラス:

class TestActor extends Actor { 

    def receive={ 
    case One(num)=>println("One "+num) 
    case t:Two=>println("Two "+t.num) 
    case _=>println("Another") 
    } 
} 

object TestActor{ 
    case class One(num:Int) 
} 

クラス2:

class Two(var num:Int){ } 

メイン:

object Main2 extends App{ 

    val system=ActorSystem("t") 
    val testActor=system.actorOf(Props[TestActor],"test") 

    val t=new Two(200) 
    val o=TestActor.One(100) 

    testActor!o 
    testActor!t 

} 

出力は次のとおりです。

One 100 
Two 200 

私はここで何かが見つからないことを知っています。おそらくパターンマッチングを理解しています。誰かが私を助けることができますか?

+0

大文字と小文字のクラスにはデフォルトの 'unapply'メソッドがあるので、' case Two(t) 'を書くことはできません。 –

+0

私のコードが大文字小文字tで動作する場合:2つ、大文字小文字の区別が必要なのはなぜですか? – codingsplash

+1

動作は同じですが、この場合はほとんどの場合読みやすさの問題です。 - 'Two(num)'を使用すると、内部変数に名前を付けて、この特定のコンテキスト_を明確にすることができます。 'case Two(receivedNum)'か何か。あなたが状態を参照した答えとして、ケースクラス(例えば、デフォルトの 'equals'と' hashCode')には他の利点がありますが、この特定のコードではどれも使用されませんでした。それでも、 "データコンテナ"であるクラスのためにケースクラスを使用することは良い習慣です。もしそれらが異なって使われるならば、それらは便利かもしれません。 –

答えて

4

あなたが気づいたように、Akkaのケースクラスとの主な違いは、マッチングの際にエクストラクタ(適用解除メソッド)を使用できることです(hashCodeのインプリメンテーション、equals、およびそれらを製品タイプとして扱う)。

大きな例では、これがどのようにうまくいくかを見ることができます。たとえば、Akka-HTTPクライアントを使用してHTTPリクエストをサードパーティサービスに送信していて、StatusCode.OKなどのステータスコードを取得した場合は、別の方法で操作したいとします。 HttpResponseunapply方法を提供するので、あなたが行うことができます:

case HttpResponse(StatusCodes.OK, _, entity, _)) => // We're good, parse the data. 
case HttpResponse(statusCode, _, _, _)) => // Operate on status code != OK 

の代わりに:

case response: HttpResponse => 
    if (response.statusCode != StatusCodes.OK) { 
    // Stuff 
    } 
    else { 
    // Other stuff 
    } 

あなたのロジックはあなたが非常に役立つとあまり冗長にすることができますしたい値だけを抽出し、より複雑になります。私たちのコードベースに、我々は複数の値を持つ、より複雑な何かを持っている、のようなもの:もちろん

case (Foo(bar, baz), [email protected](statusCode, _, _, _)) 

、あなたは常に自分自身をオブジェクトとケースクラスの同じ意味を自分で取得コンパニオンにunapplyメソッドを作成し、しかし、あなたすることができます通常、コンパイラがあなたのためにそれを行うことができるように、その定型文を書いていることは望ましくありません。

合計で、Akkaのデータコンテナとしてcase classを使用すると、パターンマッチングによる作業が容易になります。これは多くの場合、receiveメソッドを実装するときの作業です。

関連する問題