說起來,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,這部分我不太確定。