[英]Scala actor apparently not receiving messages
您能否解釋一下以下代碼為何無法正常工作。
演員沒有打印消息
謝謝。
class Base {
def f() = { "This is Base" }
}
class Sub extends Base {
override def f() = { "This is Sub" }
}
case class myCase(x: Base)
import scala.actors._
object myActor extends Actor {
def act()
{
loop {
react {
case myCase(x) => x.f()
case msg => "unknown"
}
}
}
def main(args: Array[String]): Unit = {
this ! myCase(new Base)
this ! myCase(new Sub)
}
}
該問題與繼承或案例類無關(我已對問題重新命名以反映這一點)。 該代碼不打印任何內容,原因有兩個:
因為您的代碼實際上並未調用println
! 更換:
case myCase(x) => xf()
同
case myCase(x) => println( xf() )
因為您不啟動演員 。 我認為,如果演員是一個內部階級,那么您的程序會更有意義:
object myActor extends App { class MyActor extends Actor { def act() { loop { react { ... // <-- You need to print stuff } } } } val a = new MyActor a.start() // <-- You need to start it a ! myCase(new Base) a ! myCase(new Sub) }
但是,我會建議在案例類存在的情況下使用繼承不是一個好主意 。 我通常使用在特征中聲明共同行為/狀態的方法:
sealed trait Base {
def f(): Unit
}
case class Sub() extends Base
為什么這是個壞主意? 好吧,案例類為您提供的合同之一是對等價的嚴格定義(即, equals
和hashCode
實現)。 在繼承的情況下,這很可能會產生誤導 。 也就是說,您的代碼可能不會達到您的期望。 考慮以下;
scala> abstract class Base { val x: Int }
defined class Base
scala> case class Sub(s: String) extends Base { val x = util.Random.nextInt(100) }
defined class Sub
現在,如果我創建2個實例...
scala> Sub("Hey")
res2: Sub = Sub(Hey)
scala> Sub("Hey")
res3: Sub = Sub(Hey)
它們是等效的
scala> res2 == res3
res4: Boolean = true
但是它們沒有相同的狀態
scala> res2.x
res5: Int = 28
scala> res3.x
res7: Int = 15
注意,我並不是說這是一個錯誤。 我只是說這是一個您可能會發現在代碼中引入錯誤的地方,因為您已經假設case類的任何狀態都包括在它的等價物中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.