應該不少人看到這個標題會摸不著頭緒到底要做什麼,但是看完 Julia 中常見的程式碼你就會了解了。

1
Array{Any, 2}

有沒有曾經納悶過那個數字 2 到底是怎麼進到參數的位置上的呢?

參數的位置不是只能放型別(type)嗎?

這同時也是我困惑已久的問題,就搜尋了一下,果不其然被我找到了方法:

1
2
struct A{T}
end
1
A{5}()

原來這麼簡單就可以完成了!語法上並沒有限定一定要是型別,要放型別以外的東西似乎是可以的。

我目前測試了可以的有:Int64、Float64、Complex、Char、Bool、Symbol,所以估計數字應該都是可以的。

不行的有:String、Array,估計物件或是陣列都是不行的。

定義範圍

不過使用上並沒有任何限制會有點危險,所以還是定義一下範圍會比較好,像是:

1
2
3
4
5
6
struct A{I}
function A{I}() where {I}
isa(I,Integer) || error("bad parameter")
new()
end
end

這樣就可以限制參數要是整數的範圍。

從參數取值

那我們能不能從型別的參數當中取值呢?

可以。

1
get_value(::A{I}) where A{I} = I

如此一來,我們就可以從型別中拿到值了。

好處?

這麼做有什麼好處?

當你把值的資訊放到型別當中,型別就多了一些資訊可以提供編譯器處理,這對於要自己設計型別階層可是非常好用的。

例如像是你可以將陣列的長度資訊儲存到型別上,這樣編譯器就可以處理陣列的長度資訊了。

這樣的程式風格會跟 dependent type language 有些相似了。

大家可以玩玩看。