2016-03-26 7 views
0

私はScala初心者です。私は次の例と混乱しています。Scala newbie、アクカの俳優パターンマッチングの例を理解

class AClass extends Actor{ 
    def receive = { 
    case B => println("Let's do B") 
    case C => println("Let's do C") 
    } 
} 

trait Request 
case object B extends Request 
case object C extends Request 

object Customer{ 

    def main(args: Array[String]) : Unit = { 

    val system = ActorSystem("Iwanttoeat") 
    val cook: ActorRef = system.actorOf(Props[CookSomething]) 
    cook ! B 
    cook ! C 
    } 
} 

私には3つの質問があります。

  1. 'receive'メソッドに入力パラメータがありません。私は何から何かにマッチしますか?私はそれが 'コックから来たと思う! B '。 !送って忘れることを意味します。 メソッドで明示的に入力パラメータが指定されていないので混乱しますが、BまたはCとの比較は何ですか?

  2. 私はパターン一致の例を見ました。彼らは '一致'キーワードを持っています。 中括弧の前に「一致」は省略されていますか?

3. [重要ではない]なぜ「受信」に括弧がないのですか?なぜ私はあなたの教えが必要なのですか?

乾杯

ソン

+1

Receiveは部分関数です( 'PartialFunction [Any、Unit]'が正確です)。 '{}' case文を含む中括弧は、scala内のものを定義する単なる構文糖です。 [the partial function doc](http://www.scala-lang.org/api/current/#scala.PartialFunction)を参照するか、またはこれに検索エンジンをフィードします。 – alextsc

+0

ありがとう、あなたのコメントのためのアレックス。私は考えていた。私はPartialFunctionがしばしばパターンマッチングに関連していることをオンラインで見ることができます。 – cosmir17

答えて

2
  1. ザがアッカ俳優の方法を受けるAkka Documentationで説明したように署名PartialFunction[Any, Unit]と部分関数です。 Scalaでは、入力変数を省略してパターンマッチングに直接進む特別な構文を使用して部分関数を定義することができます。詳細はEffective Scalaを参照してください。
  2. 部分機能の特殊構文については、上記のコメントを参照してください。
  3. Scalaでは、引数を持たないメソッドのかっこは省略できます。
+0

ありがとうございました。私は今理解しています:) あなたが言及したリンクから次のように引用します。代わりの 、 リストマップ{アイテム=> アイテム一致{ ケースの一部(X)=> X ケースなし=>デフォルト } } 崩壊一致 リストマップ{ ケースの一部(x)= > x ケースなし=>デフォルト } – cosmir17