【问题标题】:Elm: how does Mailbox work?Elm:邮箱是如何工作的?
【发布时间】:2015-07-11 03:04:20
【问题描述】:

假设我使用mailbox = Signal.mailbox Action 创建了一个Mailbox,其中type Action = Blah,稍后我可以使用Signal.send mailbox.address Blah 向此mailbox 发送操作,这允许我在mailbox.signal 上收听,怎么会?我的意思是,毕竟typeMailbox只是{address : Signal.Address Action, signal : Signal.Signal Action}的别名,是不是因为,在elm中,对于某种类型,只有一个信号,所以在上面的场景中,我就不用说了elm将mailbox.signalmailbox.address绑定,elm会因为某种类型的地址和信号一一对应而自己找出来?

【问题讨论】:

    标签: elm


    【解决方案1】:

    邮箱将您发送给它的事件放入其信号中的能力完全基于“魔术”,也就是说,它是本机实现的(在 JavaScript 中),而不是您可以自己实现的东西。这就是为什么它是标准库中内置的。

    创建邮箱是必要的、有效的操作(嘘,不要告诉任何人)。所以如果你使用:

    mailbox1 = Signal.mailbox Blah
    mailbox2 = Signal.mailbox Blah
    

    这两个邮箱是不同的。向mailbox2.address 发送消息将导致mailbox2.signal 上的消息,而不是mailbox1.signal。这破坏了引用透明度,这很糟糕,但现在它并没有破坏一切。 (这可能太过分了,但是因为你需要Signal 来输出并且不能有Signal (Signal something),实际上邮箱创建的非托管效果并没有把事情搞砸)。这种“泄漏”将在未来的某个时候得到解决。已经有一个提案,但是在不同版本的语言中发生了很大的变化。

    【讨论】:

    • 如果调用Signal.mailbox 两次创建两个不同的邮箱,Communicating with Mailboxes 教程中的代码,即Signal.send contentMailbox.address "hello!" 是如何工作的?由于contentMailbox 在那里第二次被调用,它应该创建一个不同的信号,这不是main = Signal.map show contentMailbox.signal 第一次调用它时使用的信号,因此 "hello" 不应该出现?
    猜你喜欢
    • 1970-01-01
    • 2014-06-10
    • 2012-11-22
    • 2015-01-10
    • 1970-01-01
    • 2012-08-02
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多