在整個 Julia 學習路徑上,你都需要把自己的解法當作小型函式庫來看待,也就是說,你需要定義函式、型別等東西,之後再讓它們對測試套件執行。 基於這個原因,我們會把具名函式當作第一個概念來介紹。
Julia 是一門動態、強型別的程式語言。 它的程式設計風格以函式式為主,但比 Haskell 這類語言更有彈性。
你不需要事先宣告變數。 只要把值指定給合適的名稱就好:
julia> myvar = 42 # an integer
42
julia> name = "Maria" # strings are surrounded by double-quotes ""
"Maria"
如果某個值需要在整個程式中都能取用,但不預期會改變,最好把它標記為常數。
在指定前加上const關鍵字,能讓編譯器產生比變數更有效率的程式碼。
常數也有助於保護你免於撰寫程式碼時的錯誤。
如果不小心嘗試修改const的值,會出現警告:
julia> const answer = 42
42
julia> answer = 24
WARNING: redefinition of constant Main.answer. This may fail, cause incorrect answers, or produce other errors.
24
請注意,const只能在任何函式外部宣告。
通常會放在*.jl檔案的開頭附近,位於函式定義之前。
這些運算子和其他許多語言相同:
2 + 3 # 5 (addition)
2 - 3 # -1 (subtraction)
2 * 3 # 6 (multiplication)
8 / 2 # 4.0 (division with floating-point result)
8 % 3 # 2 (remainder)
在 Julia 中,定義具名函式有兩種常見方式:
使用function關鍵字
function muladd(x, y, z)
x * y + z
end
為了可讀性,慣例上會縮排 4 個空格,但編譯器會忽略縮排。
end關鍵字是不可或缺的。
請注意,我們也可以寫成return x * y + z。
不過,Julia 函式一律會回傳最後一個求值的運算式,所以return關鍵字是可有可無的。
許多程式設計師偏好加上它,讓意圖更明確。
使用「指定形式」
muladd(x, y, z) = x * y + z
這最常用來撰寫簡潔的單一運算式函式。
在指定形式中,絕對不會使用return關鍵字。
這兩種形式是等價的,用法完全相同,所以挑你覺得比較好讀的就好。
呼叫函式時,要寫出函式名稱,並為函式的每個參數傳入引數:
# invoking a function
muladd(10, 5, 1)
# and of course you can invoke a function within the body of another function:
square_plus_one(x) = muladd(x, x, 1)
和許多語言一樣,Julia 要求名稱(變數、函式,以及許多其他東西的名稱)必須以字母開頭,後面可以接字母、數字和底線的任意組合。
依照慣例,變數、常數和函式的名稱使用小寫,並盡量把底線減到合理的少量。
在這項練習中,你會寫一些程式碼,幫助你照著最愛的食譜做出美味的千層麵。
你有四個任務,全都和烹調千層麵所花的時間有關。
定義expected_bake_time常數,它會回傳千層麵應該在烤箱裡烘烤幾分鐘。
根據食譜,千層麵總共需要在烤箱裡烤 60 分鐘。
julia> expected_bake_time
60
定義preparation_time函式,它接收你加進千層麵的層數作為引數,並回傳你準備千層麵花了幾分鐘,假設每一層要花你 2 分鐘準備。
julia> preparation_time(4)
8
定義remaining_time函式,它接收千層麵實際已在烤箱裡的分鐘數作為參數,並回傳千層麵還需要在烤箱裡待幾分鐘。
julia> remaining_time(50)
10
定義total_working_time函式,它接收兩個引數:第一個引數是你加進千層麵的層數,第二個引數是千層麵已經在烤箱裡的分鐘數。
這個函式應該回傳你烹調千層麵總共工作了幾分鐘,也就是準備時間的分鐘數,加上千層麵目前待在烤箱裡的時間的分鐘數。
julia> total_working_time(3, 20)
26