2012-10-12 82 views
0

我正在做家庭作業,修改由我的教授創建的代碼。不幸的是,他目前無法提供給我,所以我正在接觸到大量人羣。爲什麼這個循環的循環部分不會按照我所期望的方式「循環」?

該片段來自一個文件「Peer.scala」,該文件與另一個類「RemoteActorChat.scala」中的actor進行通信。爲了簡潔起見,我只包括了我認爲是我的問題的原因的片段。如果其他代碼在尋找解決方案時很有用,我會很樂意發佈它。

我的意圖是讓對端捕獲來自控制檯的輸入連續循環,同時對來自RemoteChatActor的任何消息作出反應。

...

def act { 
... 
loop { 
    val textInput = Console.readLine(name + ">").toString() 
    textInput match { 
    case "Unsubscribe" => 
     unsubscribe 

    case "Subscribe" => 
     subscribe(name)) 

    case "?" => 
     println("Type any message to send it to the chatroom") 
     println("Type 'Unsubscribe' (without quotes) to leave the chatroom") 
     println("Type 'Subscribe' (without quotes) to re-join the chatroom") 

    case _ => 
     post(textInput) 
    } 

    react { 
    case Post(msg) => 
     println(name + " got a post = " + msg) 
    } 
} 

}

...

當inputText的匹配到_ POST功能被調用時,確實它的東西,我得到另一個提示。如果我願意,我可以整天發佈信息。

但是,當inputText與「取消訂閱」,「訂閱」或「?」匹配時,行爲會有所不同。該案件中的陳述被執行IE)取消訂閱或訂閱功能被調用並按預期執行他們的事情。但是,我沒有得到提示,繼續從控制檯發送輸入。同行基本上只是掛在這一點上。我期待另一個提示,但控制檯窗口只是空的,並沒有任何額外的輸入。

很明顯,我對如何工作的理解是有缺陷的。
我誤解了什麼,我該如何讓它做我想要的?

回答

0

演員正在等待react內部的Post。它不會一直持續下去。既然你只發送一個案件,只有這種情況才能通過。

如果你想在其他情況下工作,要麼讓他們也送了react塊可以接收(至少爲case _的反應塊內),或移動反應塊了消息,所以它只會進入如果實際上有一個Post在某個時候回來的話。

+0

有效的解決方案是讓textInput匹配個案發送消息「取消訂閱」「訂閱」和「?」自己,然後將這三個案件添加到反應部分? – NickAbbey

+0

@NickAbbey - 我不確定「有效」是什麼意思,但它會編譯並給你重複的提示。但是,您可能還會注意到,每條命令只能獲得一條消息,如果這確實用於消息傳遞,那麼您可能希望看到_all_帖子,而不是每次輸入一行文本時都會發布一條消息。所以作爲一個聊天室很有用,它需要一些重大的改進。 –

+0

那麼......現在我認爲「有效」意味着「將編譯並給出重複提示」,因爲這只是一項家庭作業,而不是真實世界部署的意義。 – NickAbbey

相關問題