[英]Resources on managing, phasing, composing monads (in Scala or Haskell)
[英]Managing Resources with FRP in Scala RX
我正在使用scala rx
进行应用程序。 我有一个持有File
的反应变量(这是一个PDF文件)。 我正在使用库将此pdf文件中的页面呈现到屏幕上。 现在我正在使用的PDF库给了我一个对象(让我们称之为Doc
),我可以使用它来渲染单个页面。 但是,为了从Doc
对象呈现页面,必须打开Doc
对象(因此必须获取资源)。
现在我正在为我正在重新渲染的每个页面加载pdf文件(创建一个新的Doc
对象并在渲染单个页面后关闭它)。 这使得页面的呈现起作用(给定文件和页码,返回图像)。
有没有办法坚持打开资源并在FRP的变化中关闭它 ,特别是scala rx
? 如何处理这种非常常见的情况?
您只需将Doc对象括起来即可。 所以不是渲染存在
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返回到你正在做出的任何页面更改信号。
编辑 :哦,我明白了,所以你说你希望它在文件时关闭文件:文件信号变为另一个文件。 在这种情况下,您应该能够做到这样的事情:
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的信号,每个lambdas关闭一个特定文件并从中返回页面。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.