為了後面寫程式可以避免犯錯,今天得回過頭來讀一下Julia的說明文件,尤其是那些我之前在其他語言比較沒碰過的規範。今天我得回過頭來看的一個東西就是變數的可視範圍(scope)。話說昨天自己在寫Julia版的BEDTools makewindows時,就因為自己對Julia裡面的scope不太熟悉,結果程式在跑的時候就完全不是按照自己所想的那樣去執行,因此今天下午花了點時間讀了一下文件,就順便把結果整理在這邊了。
Scope的定義在此我不再多提,畢竟隨便google一下就可以找到一堆說明。根據Julia官方說明文件的說法,其scope可分為global scope
及local scope
兩大類(也就是說以往其他程式語言中所談到的區塊變數
其scope在這邊還是會被分成這兩大類XD)。根據這樣的想法,不難想像在一般我們熟悉的for
, while
, try-catch-finally
, let
, function
, comprehension
, struct
以及macro
當中都屬於local scope
,而我比較訝異的是module
及baremodule
則都屬於global scope
的範疇。另外,Julia採用的是lexical scoping(詞法作用域)
,簡單說就是內層區塊的變數不可為外層區塊所用,而外層區塊的變數卻可被內層區塊所使用。不過也因為如此,我遇到的問題也在此:在內層區塊如果要改變外層區塊的變數(也就是在local scope
中取用global scope
中的變數)須得在前面加上global
,但若是在內層區塊中的內層區塊要改變前一層的變數卻不用。
用程式碼來說明就是:
sum = 0
while sum<= 10
sum += 1
end
println(sum)
上面會報錯ERROR: LoadError: UndefVarError: sum not defined
,但加上global
就不會
sum = 0
while sum<= 10
global sum += 1
end
println(sum)
如果是巢狀迴圈,在最裡層區塊對與外面一層區塊同名變數操作,其結果就會影響到外層local scope
中的變數
tmp = true
while tmp
sum = 0
while sum <= 10
sum+=1
end
global tmp = false
println("SUM: ", sum)
end