1

我正在使用一个没有 F# 文档的库,只有 C#。不熟悉 C# 我遇到了一些麻烦。通读 NetMQ的文档,有一行我在翻译时遇到了问题:

对于上下文,这是完整的示例:

using (var rep1 = new ResponseSocket("@tcp://*:5001"))
using (var rep2 = new ResponseSocket("@tcp://*:5002"))
using (var poller = new NetMQPoller { rep1, rep2 })
{
    rep1.ReceiveReady += (s, a) =>    // ??????
    {
        string msg = a.Socket.ReceiveString();
        a.Socket.Send("Response");
    };
    rep2.ReceiveReady += (s, a) =>    // ??????
    {
        string msg = a.Socket.ReceiveString();
        a.Socket.Send("Response");
    };

    poller.Run();
}

具体来说,我不知道rep1.ReceiveReady += (s, a) =>在 C# 的上下文中是什么意思以及如何将其转换为 F#。有任何想法吗?谢谢。

4

1 回答 1

4

rep.ReceiveReady += (s, a) => { /*...*/ };ReceiveReady正在使用 lambda 函数订阅事件。这是直接的 F# 翻译:

use rep1 = new ResponseSocket("@tcp://*:5001")
use rep2 = new ResponseSocket("@tcp://*:5002")

use poller = new NetMQPoller()
poller.Add rep1
poller.Add rep2

rep1.ReceiveReady.Add (fun a -> let msg = a.Socket.ReceiveString ()
                                a.Socket.Send "Response")
rep2.ReceiveReady.Add (fun a -> let msg = a.Socket.ReceiveString ()
                                a.Socket.Send "Response")

poller.Run ()

可以在文档中找到有关 F# 中事件处理的进一步阅读。但是请注意,F# 也可以将事件视为可观察的,这可能被认为更惯用。

于 2016-07-31T00:47:20.173 回答