-1

私はScalaと呼ばれるこの派手な言語に不慣れです。

私はC++で十分な(おそらく)プログラミングの経験があります。プログラミング演習として、Scalaのアクターモデルを使用して配列の要素を追加しようとしていました。私はworkerActorという名前のクラスを作成します。私のメインメソッドでは、このクラスのオブジェクトを作成してから、このオブジェクト(ScalaのActorクラスからクラスを拡張するときのアクター)にメッセージを送信しようとします。アクターに文字列を渡すと、actメソッド内のコードが実行され、ロジックが正しいケースになり、誰もが満足します。ただし、サンプルのようなオブジェクトにタプルを渡そうとすると!(2,4、arr)

2と4は、アクターに計算を実行させたい配列内のインデックスであり、arrは、渡したい配列です。エラーが表示されます。配列と配列のインデックスをアクターに渡すにはどうすればよいですか。Scalaはタプルをアクターに渡すことを許可していますか?

興味深い観察として、act()メソッドに2番目のケースがあると、コンパイルエラーが発生することに気付きました。Eclipseは到達不能コードを表示します。receiveメソッドで2番目のケースを使用できない理由が何であるかがわかります。

case object add
case object trial

import scala.actors._
import Actor._

class workerActor(arr: Array[Int]) extends Actor{
def addarr(a: Int, b: Int): Int = {
var sum = 0
for (i <- a to b)
  sum += arr(i)
  println("Sum :",a,b,sum)
sum
}
def act(){
   receive {
   case trial => println("Received trial")
   //case trial => println("Received add") //uncommenting this line does not compile the program
   }
}
}

object hello {
  def main(args: Array[String]): Unit = {
    println("Hello World")
    val arr = Array(1,2,3,4,5,7,13,4,6,6,23);
    val sample = new workerActor(arr)
    val s = sample.addarr(2, 4,arr)
    sample ! (2,4)
    sample ! "try"
    sample ! add
    sample.start   
    sample ! trial
  }
}

タプルの受け渡しに関する問題ではなく、これは、受信時に複数のケースがあるという奇妙な問題(おそらく構文)のように見えます。

4

1 に答える 1

1

問題は、caseステートメントでは、Scalaが小文字で始まる識別子を変数として扱うため、最初のケースでは「trial」と呼ばれる新しい変数を実際に割り当てていることです。

case trial => println("Received trial")
case add   => println("Received add")

簡単な例で「割り当て」の動作を確認できます。

scala> 5 match { case something => println("matched " + something) }
matched 5

が割り当て可能な変数である場合trial、それは何にでも一致する可能性があるため、最初のケースは常に成功します...trialaddオブジェクトの両方に対して。最初のケースは常に成功するため、2番目のケースに到達できないことを示すエラーが発生します。

これを修正するには、「安定した識別子」を使用する必要があります。安定した識別子はバッククォートに含まれています:

case `trial` => println("Received trial")
case `add`   => println("Received add")

または大文字で始めます:

case object Add
case object Trial

...

case Trial => println("Received trial")
case Add   => println("Received add")
于 2012-09-05T04:34:23.133 に答える