簡體   English   中英

Scala演員顯然沒有收到消息

[英]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)
  }
}

回答問題

該問題與繼承或案例類無關(我已對問題重新命名以反映這一點)。 該代碼不打印任何內容,原因有兩個:

  1. 因為您的代碼實際上並未調用println 更換:

     case myCase(x) => xf() 

     case myCase(x) => println( xf() ) 
  2. 因為您不啟動演員 我認為,如果演員是一個內部階級,那么您的程序會更有意義:

     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

為什么這是個壞主意? 好吧,案例類為您提供的合同之一是對等價的嚴格定義(即, equalshashCode實現)。 在繼承的情況下,這很可能會產生誤導 也就是說,您的代碼可能不會達到您的期望。 考慮以下;

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM