第七章 F 庫(二)

2021-06-21 14:27:18 字數 2345 閱讀 6660

第七章 f# 庫(二)

反射(microsoft.fsharp.reflection)模組

這個模組包含了f# 自己的反射(reflection)版本。f#中的某些型別和通用語言執行時(clr)的型別系統百分之百相容,但是,它們並不能被.net反映準確理解。例如,f# 使用了某種技術實現了聯合型別,這對純f#**來說是的;當你使用bcl 對它進行反射時,看起來有點奇怪,f#的反射系統解決了這種問題。但是,它和bcl 的system.reflection命名空間的混合,因此,如果你反映f# 型別使用bcl的型別,就會得到來自system.reflection 命名空間的適當型別。

在f# 中,既可以反射,也可以反射值,差別有一點微妙,因此,最好的解釋是用示例。熟悉.net反射的人可以把反射型別是使用type、eventinfo、fieldinfo、methodinfo和propertyinfo 型別,而把反射值看做是呼叫它們的成員,比如,用getproperty或invokemember動態獲得值;然而,反射值提供了高階、易用的系統。

反射型別(reflection over types):檢查組成特定值或型別的型別;

反射值(reflection over values):檢查組成特定組合值(composite value)的值。

反射型別(reflection over types)

下面示例中函式能夠列印任何元組的型別:

open microsoft.fsharp.reflection

let printtupletypes (x: obj) =

let t = x.gettype()

if fsharptype.istuple t then

types = fsharptype.gettupleelements t

printf "("

types

|> seq.iteri

(fun i t ->

if i <> seq.length types - 1 then

printf " %s * " t.name

else

printf "%s" t.name)

printfn " )"

else

printfn "not a tuple"

printtupletypes ("hello world", 1)

首選,使用物件的gettype 方法得到表示這個物件的型別(system.type);然後,對這個值使用函式fsharptype.istuple檢查它是否是元組;接著,再使用函式fsharptype.gettupleelements得到乙個型別(system.type)陣列,描述組成元組的元素。這些可以表示成f#的型別,因此,能夠遞迴地呼叫函式,檢查它們的內容。這裡,我們知道它們是.net bcl的型別,就簡單地輸出型別的名字,這樣,示例執行的結果如下:

( string * int32 )

反射值(reflection over values)

假設不想顯示元組的型別,而是想顯示組成元組的值,需要這樣做:使用反射值,還需要使用函式fsharpvalue.gettuplefields得到乙個物件陣列,這是組成這個元組的值。這些物件可能是元組,也可能是其他f# 型別,因此,需要遞迴呼叫這個函式,去輸出物件的值。然而,在這裡,我們知道底層的值來自bcl 的庫,因此,只要簡單地使用f# 的printfn函式來輸出就行了,f# 的printf模組在本章的後面有講解。下面的示例實現了這樣乙個函式:

open microsoft.fsharp.reflection

let printtuplevalues (x: obj) =

if fsharptype.istuple(x.gettype()) then

let vals = fsharpvalue.gettuplefields x

printf "("

vals

|> seq.iteri

(fun i v ->

if i <> seq.length vals - 1 then

printf " %a, " v

else

printf " %a" v)

printfn " )"

else

printfn "not a tuple"

printtuplevalues ("hello world", 1)

**的執行結果如下:

( "hello world", 1 )

反射既可以用於fsi,它是f#工具套件中的互動式命令列工具,也可以f# 庫函式printf族。如果要學習更多有關反射的使用,可以看一看printf 的源**,在發布的\source\fsharp\printf.fs和\source\fsharp\layout.ml 中。

第七章 F 庫(四)

第七章 f 庫 四 列印 microsoft.fsharp.text.printf 模組 列印 printf 模組提供了以型別案例的方式格式化字串的函式,列印模組中函式的第乙個引數是值的佔位符,它返回的函式需要為佔位符提供值 佔位符用百分號加乙個表示型別的字母組成,表 7 2 是完整的清單。表 7 ...

python第七章 python教程(第七章)

字典和集合 字典是python中唯一,乙個對映型別 如何建立乙個字典,如下 dict dict 滲透 網路安全 怎麼理解字典呢?現實生活中的字典可以通過首字母進行查詢要查詢的漢子,python也可以這樣理解,通過 前的元素查詢到冒號後的元素。為什麼說字典是唯一乙個對映型別呢?看圖。對映型別區別與序列...

第二本 第七章

1.清除浮動的方法有哪幾種?分別如何實現?答 使用clear屬性清除文字左側的浮動內容,right屬性清除文字右側的浮動內容,both屬性清除文字左,右二側的浮動內容。2.使用display inline block或float布局網頁有什麼區別?需要注意什麼?答 inline 使元素變成行內元素,...