events - 是否可以对 F# 事件使用成员而不是 let?

标签 events f# observable

在此代码中,EventL 使用 let 绑定(bind),EventM(试图)使用成员:

type MyType() =
   let EventL = new Event<_>()
   member this.EventM = new Event<_>()

   member this.AddHandlers() =
      Event.add (fun string1 -> printfn "EventL: %s" string1) EventL.Publish
      Event.add (fun string1 -> printfn "EventM: %s" string1) this.EventM.Publish

   member this.Trigger(message) =
      EventL.Trigger(message)
      this.EventM.Trigger(message)

let myMyType = MyType()
myMyType.AddHandlers()
myMyType.Trigger("Event arg.")

运行时,仅输出 EventL: Event arg.EventM 的处理程序未被调用。

我是不是犯了一个愚蠢的错误,或者遗漏了一些关于成员的逻辑?

最佳答案

您的 EventM 是一个计算属性,每次调用时都会对其进行评估。这会导致在其余代码中创建不同的 Event 对象(2 次,一次在 AddHandlers 中,下一次在 Trigger 中)。

检查 member val 语法。这创建了一个支持领域,并且仍然为公众提供可访问性。

固定版本为:

type MyType() =
    member val EventM = new Event<_>()

如果您没有主构造函数,那么您将需要使用 val 并将其分配给您的构造函数:

type MyType =
    val EventM : Event<string>
    new () = { EventM = new Event<_>() }

请注意,在这种情况下,您必须将类型参数提供给 Event

关于events - 是否可以对 F# 事件使用成员而不是 let?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35949863/

相关文章:

f# - 最后一个参数是否有一些管道运算符或在 F# 中定义它的方法?

c# - 为什么没有订阅者时委托(delegate)为空而不是空列表?

javascript - targetTouches是否跟踪同时在多个元素上移动的触摸?

javascript - 静态表更改的 DOM 监听器

java - 基于模块或插件开发系统应该如何入手?

macos - 适用于 Mac 的最佳 F# IDE

c# - 什么任务最适合用函数式编程风格完成?

swift - 如何在 Reactive Extensions 中组合两个 observables 以便对结果进行分页?

angular - 如果每个 observable 都有新数据,我如何才能一次订阅 angular2 中的多个 observable 并等待?

javascript - 展平嵌套的 Observables.subscribe