![](/img/trans.png)
[英]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.