16 1 5 在 F 中宣告事件

2021-08-26 14:00:53 字數 1841 閱讀 5881

16.1.5 在 f# 中宣告事件

為了宣告乙個新事件,需要兩件東西。首先,必須建立乙個可以發布的事件值,以便其他斯可以訂閱新建立的事件。這一次,我們需要使用 f# 特有的 ievent <'t> 介面,而不是 .net 的 iobservable<'t>。我們還需要一種觸發該事件的方法。在 c# 中,可以使用方法呼叫的語法,來觸發事件,只是從宣告的類中。當我們在 f# 中建立乙個新的事件時,就會得到觸發它的函式。

所有這一切,用示例來說明,就更清晰了。清單 16.6 顯示了乙個簡單的具體物件型別(類),只公開乙個事件和有時觸發事件的乙個方法。

listing 16.6 declaring an event as a class member (f# interactive)

> type counter() =

let mutable num = 0

let changedevt = new event<_>()

member x.signchanged = changedevt.publish

member x.add(n) =

let original = num

num <- num + n

if (sign(original) <> sign(num)) then

changedevt.trigger(num);;

> let c = counter()

c.signchanged |> observable.add (printfn "number: %d");;

type counter = (...)

> c.add(10);;

number: 10

> c.add(10);;

> c.add(-30);;

number: –10

counter 類包含乙個儲存當前數值的可變字段,add 方法修改這個字段,當儲存數值變化時,應該觸發 signchanged 事件。為了宣告乙個新的事件,我們使用來自 f# 庫的 event<'t> 類。此類包含 publish 成員,返回相應的、可以監聽的 ievent<'t> 值,和執行這個事件的 trigger 成員。

清單 16.6 顯示在型別宣告中處理事件的典型方式。將event 類的例項儲存為本地值 ,公開由 publish 成員返回的事件值,作為該類的公共成員,以便使用者可以監聽這個事件,但不能觸發它。當滿足適當條件時,使用 trigger 成員,觸發該事件。

宣告相容 c# 的事件

我們在這一節中使用的、建立事件的技術可以很自然地用於 f#,但不能顯示為標準的 c# 事件。f# 編譯器不會以任何特殊的方式,對待 ievent<'t> 型別的屬性,因此,它將 signchanged 編譯為乙個標準屬性的成員。我們可以在 c# 中使用介面的 addhandler 方法的,但這會引起混亂。

幸運的是,f# 編譯器提供了一種簡單的方法解決此問題。如果要在 f# 中宣告乙個標準的 .net 事件,可以使用 clievent 屬性值。編譯器能夠理解這個屬性值,在這裡,編譯器將建立乙個事件,可以使用 c# 中的 += 運算子和-= 運算子進行訪問:

type counter() =

member x.signchanged = ev.publish

到目前為止,f# 我們建立的事件和常用的 c# 事件的另乙個區別,是 f# 使用它自己的泛型委託型別(handler)。如果要使用某些其他委託時,可以用 event<'tdel, 't> 類建立事件,它用第乙個引數值來指定委託的型別。例如,在典型的 windows 程式設計中,可以使用 event型別來建立事件。

到目前為止,我們已經研究了一些把事件作為一等值的好處。最重要的概念可能是使用高階函式處理事件的能力,視其為範圍內序列的值。現在,我們將擴充套件前一章的動畫示例,允許使用者和動畫進行互動。

在類中宣告屬性

在類中宣告屬性 這裡我們想要強調乙個重要的傳統 python 編碼和kivy 之間的不同點,以及這個改變的用途。做好準備 我們要記得在 python 中宣告屬性的傳統形式。通常,如果我們想要在 python 中宣告乙個屬性,我們會按照下面的方式來做。class myclass object def ...

js中onkeydown事件,相容IE和FF

概念 onkeypress onkeyup onkeydown區別 onkeypress 這個事件在使用者按下並放開任何字母數字鍵時發生。系統按鈕 例如,箭頭鍵和功能鍵 無法得到識別。onkeyup 這個事件在使用者放開任何先前按下的鍵盤鍵時發生。onkeydown 這個事件在使用者按下任何鍵盤鍵 ...

在C Builder中定義事件

在c builder中,事件是一種委託模型,它是對訊息的封裝。如果你用過vc,你就知道在vc中並不存在什麼事件,而只有訊息處理函式,而在c builder中則是由事件處理函式來負責響應訊息。同是,事件本身也是一指標,它是乙個閉包,通常在c builder中有兩種事件 通知型別事件 即tnotifye...