这个Scala代码在惯用的C#中看起来如何?

时间:2010-10-14 17:13:23

标签: c# scala concurrency xmpp actor

在为我们正在开发的.Net项目研究XMPP时,我遇到了这个非常漂亮的Scala代码:

object Main {

  /**
   * @param args the command line arguments
   */
  def main(args: Array[String]) :Unit = {
      new XMPPComponent(
        new ComponentConfig() {
            def secret() : String = { "secret.goes.here" }
            def server() : String = { "communitivity.com" }
            def subdomain() : String = { "weather" }
            def name() : String = { "US Weather" }
            def description() : String = { "Weather component that also supported SPARQL/XMPP" }
        },
       actor {
        loop {
            react {
                case (pkt:Packet, out : Actor) =>
                    Console.println("Received packet...\n"+pkt.toXML)
                    pkt match {
                        case message:Message =>
                            val reply  = new Message()
                            reply.setTo(message.getFrom())
                            reply.setFrom(message.getTo())
                            reply.setType(message.getType())
                            reply.setThread(message.getThread())
                            reply.setBody("Received '"+message.getBody()+"', tyvm")
                            out ! reply
                        case _ =>
                            Console.println("Received something other than Message")
                    }
                 case _ =>
                    Console.println("Received something other than (Packet, actor)")
            }
        }
       }
    ).start
  }
}

(这取自http://github.com/Communitivity/MinimalScalaXMPPComponent/blob/master/src/org/communitivity/echoxmpp/Main.scala

actor和模式匹配的东西看起来像是一种以可伸缩的方式编写组件的非常好的方法。我找不到任何看起来很成熟的C#演员库,而且学习Axum似乎有些过分。

在C#中攻击它的正确方法是什么? (当然,忽略XMPP特定的代码 - 我对C#版本的actor和模式匹配看起来更感兴趣。)

1 个答案:

答案 0 :(得分:3)

有一个类似于.NET的Actor可以用于.NET集retlang,而F# agents也类似。

另见question