假設你想要 0 到 1000 之間所有的非負整數。 如果得把這些數字一個一個打進陣列裡,那也太荒謬了。
為此,我們有 range 型別:
julia> 0:1000
0:1000
julia> typeof(0:1000)
UnitRange{Int64}
區間非常常見:不只是為了省下打字,也常作為函式的回傳型別。
注意,區間_不是_向量。 它們只是一組用來產生序列的指令(「惰性」求值,或稱「疊代器」)。
如果你需要把區間當成向量使用,可以用 collect() 函式來轉換:
julia> collect(0:5)
6-element Vector{Int64}:
0
1
2
3
4
5
也可以指定步長,這裡是 0.3:
julia> collect(1.0:0.3:2.0)
4-element Vector{Float64}:
1.0
1.3
1.6
1.9
所以語法是 start:stepsize:stop。
兩端的界限都_包含在內_,就像整數的範例那樣。
如果步長無法整除 stop - start,最後一個元素也不會超過 stop。
區間也能用於非數字的序列,最簡單的例子就是 ASCII 字母:
julia> 'a':'d'
'a':1:'d'
julia> typeof('a':'d')
StepRange{Char, Int64}
julia> collect('a':'d')
4-element Vector{Char}:
'a': ASCII/Unicode U+0061 (category Ll: Letter, lowercase)
'b': ASCII/Unicode U+0062 (category Ll: Letter, lowercase)
'c': ASCII/Unicode U+0063 (category Ll: Letter, lowercase)
'd': ASCII/Unicode U+0064 (category Ll: Letter, lowercase)
Char 型別會在另一個概念中介紹得更詳細。
現在,只要把它們當成用單引號括住的單一字元就好。
用 first() 和 last() 檢查區間的界限。
r = 1:10 # => 1:10
first(r) # => 1
last(r) # => 10
整數區間和向量都可以用在向量的索引上:
nums = collect(10.0:50.0)
nums[3:2:7] # gives [12.0, 14.0, 16.0]
nums[ [3, 5, 7] ] # also gives [12.0, 14.0, 16.0]
身為一位西洋棋愛好者,你會想寫出自己的版本。沒錯,線上可能已經有很多現成的西洋棋實作,但你的版本會是獨一無二的!
不過,在盡情發揮想像力之前,得先處理好基本功。我們就從產生棋盤開始吧。
棋盤上的每個格子都由一組字母和數字來標示。這些方格組成的垂直行稱為直行,以 A 到 H 標示。水平方向的橫列則以 1 到 8 編號。
實作rank_range()函式。它應該回傳一個整數範圍,從 1 到 8。
julia> rank_range()
# output omitted
實作file_range()函式。
它應該回傳一個字元範圍,從大寫字母 A 到大寫字母 H。
julia> file_range()
# output omitted
實作ranks()函式。它應該回傳一個整數向量,從 1 到 8。
不要手動寫出這個向量,而是用rank_range()函式回傳的範圍來產生。
julia> ranks()
[1, 2, 3, 4, 5, 6, 7, 8]
實作files函式。它應該回傳一個字元向量,從 'A' 到 'H'。
不要手動寫出這個向量,而是用file_range()函式回傳的範圍來產生。
julia> files()
['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']