【问题标题】:Managing Resources with FRP in Scala RX在 Scala RX 中使用 FRP 管理资源
【发布时间】:2014-07-21 20:55:06
【问题描述】:

我将scala rx 用于应用程序。我有一个反应变量持有File(这是一个PDF文件)。我正在使用一个库将此 pdf 文件中的页面呈现到屏幕上。现在我使用的 PDF 库给了我一个对象(我们称之为Doc),我可以用它来渲染单页。但是为了从Doc 对象渲染页面,必须打开Doc 对象(因此必须获取资源)。

现在我正在为我重新渲染的每个页面加载 pdf 文件(创建一个新的 Doc 对象并在渲染单个页面后关闭它)。这使得页面的呈现功能(给定一个文件和一个页码,返回一个图像)。

有没有办法在 FRP 中,特别是对于 scala rx,在 FRP 中保持打开的资源并在更改时关闭它?如何处理这种非常常见的情况?

【问题讨论】:

    标签: scala frp


    【解决方案1】:

    您可以简单地封装 Doc 对象。所以不是 render 是

    def render(file: File, pageNumber: Int): Image =  // blah blah blah
    

    改成:

    def open(file: File): (Int => Image) = {
      val doc = // call your library to read file
      (x: Int) => doc.getPage(x)
    }
    

    然后将函数 open 返回到您正在响应的任何页面更改信号。

    编辑:哦,我明白了,所以你说你希望它在 file:File 信号更改为不同文件时关闭文件。在这种情况下,您应该可以执行以下操作:

    def pageGetterRx(file: Rx[File]): Rx[Int => Image] = {
      val doc: Var[Doc] = Var(null)
      val o = file.foreach { f =>
        Option(doc()).foreach(_.close)
        doc() = PdfLib.read(f)  // or however you do the reading
      }
      Rx {
        (x: Int) => doc().getPage(x)
      }
    }
    

    编辑 2:澄清一下,如果您在 FRP 上施加“组装功能网络阶段/在某些信号阶段运行网络”区别,则上述函数将仅调用一次;在组装阶段。换句话说,pageGetterRx(一个糟糕的名字,我完全知道)不参与 FR 方式,而是返回一个 lambdas 信号,每个关闭一个特定文件并从中返回页面。

    【讨论】:

    • 我如何确保doc 在不再使用时被关闭?
    • 向垃圾收集器挥手。 ;-) 我的意思是,没有其他方法可以做到这一点,除非您有其他信号告诉您何时不再使用它,在这种情况下,您可以让 open 返回两个函数,每个信号一个。
    • 问题具体是关于如何以定义的方式释放资源。如果这不明显,我很抱歉(我添加了强调)。
    • 如果您认为这是不可能的,这也是一个有效的答案。
    • 对不起,如果这不是惯用的,我从未使用过 scala rx,我的 FRP 经验是使用 Elm。但它应该知道如何做到这一点……希望如此?
    猜你喜欢
    • 2013-08-15
    • 2014-10-27
    • 2021-12-30
    • 2023-03-22
    • 1970-01-01
    • 2014-11-05
    • 2011-11-18
    • 2016-12-23
    • 1970-01-01
    相关资源
    最近更新 更多