在參數化型別中定義值
應該不少人看到這個標題會摸不著頭緒到底要做什麼,但是看完 Julia 中常見的程式碼你就會了解了。
1 | Array{Any, 2} |
有沒有曾經納悶過那個數字 2 到底是怎麼進到參數的位置上的呢?
參數的位置不是只能放型別(type)嗎?
這同時也是我困惑已久的問題,就搜尋了一下,果不其然被我找到了方法:
1 | struct A{T} |
1 | A{5}() |
原來這麼簡單就可以完成了!語法上並沒有限定一定要是型別,要放型別以外的東西似乎是可以的。
我目前測試了可以的有:Int64、Float64、Complex、Char、Bool、Symbol,所以估計數字應該都是可以的。
不行的有:String、Array,估計物件或是陣列都是不行的。
定義範圍
不過使用上並沒有任何限制會有點危險,所以還是定義一下範圍會比較好,像是:
1 | struct A{I} |
這樣就可以限制參數要是整數的範圍。
從參數取值
那我們能不能從型別的參數當中取值呢?
可以。
1 | get_value(::A{I}) where A{I} = I |
如此一來,我們就可以從型別中拿到值了。
好處?
這麼做有什麼好處?
當你把值的資訊放到型別當中,型別就多了一些資訊可以提供編譯器處理,這對於要自己設計型別階層可是非常好用的。
例如像是你可以將陣列的長度資訊儲存到型別上,這樣編譯器就可以處理陣列的長度資訊了。
這樣的程式風格會跟 dependent type language 有些相似了。
大家可以玩玩看。