iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 5
0

說起來,Julia的型別真是非常意義不明的東西,但是又很優雅。

如果有寫過其他語言的朋友,Julia的型別定義上非常像C裡面的struct,他只有定義了fields。
但是官方介紹型別系統的時候又把他當成物件看待,搞得我好亂阿!

迷你版物件

在Julia裡,型別的定義會像這樣

type Coordinate
    x::Float64
    y::Float64
end

type是關鍵字,後面的Coordinate是型別的名字,他跟其他結構一樣用end結尾。
其中定義了兩個成員變數分別是xy,在這邊我們有定義xy的型別,都是Float64,你可以不要定義他。
這個型別代表的是在數學的二維座標上分別用xy來表達一個座標,也就是(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裡面就存放了xy,要用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怎麼沒有封裝

是的!Julia的型別不需要封裝!
他不像其他語言一樣去控制存取權,所以所有的field都是public的!

型別的抽象

在Julia中,不像以往的物件導向,他的抽象型別只能寫成這樣

abstract ABC

如果要宣告新的型別是ABC的子型別的話就這樣寫

type DEF <: ABC
    ...
end

可是要記住,只有abstract可以有子型別,type是沒辦法有子型別的喔~~

小筆記: Julia的型別系統似乎比較像是Common Lisp Object System,這部分我不太確定。


上一篇
[Day 04] Julia的函式
下一篇
[Day 06] Multiple dispatch
系列文
Julia語言—從入門到專案31

尚未有邦友留言

立即登入留言