說起來,Julia的型別真是非常意義不明的東西,但是又很優雅。
如果有寫過其他語言的朋友,Julia的型別定義上非常像C裡面的struct,他只有定義了fields。
但是官方介紹型別系統的時候又把他當成物件看待,搞得我好亂阿!
在Julia裡,型別的定義會像這樣
type Coordinate
    x::Float64
    y::Float64
end
type是關鍵字,後面的Coordinate是型別的名字,他跟其他結構一樣用end結尾。
其中定義了兩個成員變數分別是x跟y,在這邊我們有定義x跟y的型別,都是Float64,你可以不要定義他。
這個型別代表的是在數學的二維座標上分別用x跟y來表達一個座標,也就是(x, y)。
c = Coordinate(3, 4.0)
println(c)
使用上會像這樣,(3, 4.0)的前者對應的是在前面的x,後者則對應y。
一開始你仍然要宣告變數,這個變數就是Coordinate這個物件,他的座標是(3.0, 4.0)。
你會注意到我定義的Coordinate中,x的型別應該是Float64,不過我給的是3,Julia會自動幫你轉成Float64喔~~~
你可以把它印出來看看是甚麼樣子。
println(c.x)
println(c.y)
現在你的c裡面就存放了x跟y,要用c.x這種方式去存取值。
所以可以印出來看看是不是都如你所設定的呢。
c.x = 12.34
像這樣的話就可以重新設定x.c了。
通常在物件導向裏面我們都會事先定義好物件的行為,但是Julia定義物件的行為會像是外掛的方式。
function norm(coord::Coordinate)
    return (coord.x^2 + coord.y^2)^0.5
end
像一般定義函式的方式寫即可!
請加註參數的型別喔!像coord::Coordinate這樣,他就能指定這個行為給特定型別。
你看!
println(norm(c))
回傳
5.0
像這種我稱為外掛的方式定義行為很有趣。
當我如果想要擴充某個既定套件的功能的時候,我完全不用去更動到套件裡的任何一個字,我只要把套件載入進來,然後再定義新的行為上去就行了。
是的!Julia的型別不需要封裝!
他不像其他語言一樣去控制存取權,所以所有的field都是public的!
在Julia中,不像以往的物件導向,他的抽象型別只能寫成這樣
abstract ABC
如果要宣告新的型別是ABC的子型別的話就這樣寫
type DEF <: ABC
    ...
end
可是要記住,只有abstract可以有子型別,type是沒辦法有子型別的喔~~
小筆記: Julia的型別系統似乎比較像是Common Lisp Object System,這部分我不太確定。