iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 21
0

前面兩週都在講Bio

為了後面寫程式可以避免犯錯,今天得回過頭來讀一下Julia的說明文件,尤其是那些我之前在其他語言比較沒碰過的規範。今天我得回過頭來看的一個東西就是變數的可視範圍(scope)。話說昨天自己在寫Julia版的BEDTools makewindows時,就因為自己對Julia裡面的scope不太熟悉,結果程式在跑的時候就完全不是按照自己所想的那樣去執行,因此今天下午花了點時間讀了一下文件,就順便把結果整理在這邊了。

Scope of variable

Scope的定義在此我不再多提,畢竟隨便google一下就可以找到一堆說明。根據Julia官方說明文件的說法,其scope可分為global scopelocal scope兩大類(也就是說以往其他程式語言中所談到的區塊變數其scope在這邊還是會被分成這兩大類XD)。根據這樣的想法,不難想像在一般我們熟悉的for, while, try-catch-finally, let, function, comprehension, struct以及macro當中都屬於local scope,而我比較訝異的是modulebaremodule則都屬於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

上一篇
[Day 20] 先來自幹一個makewindows的功能好了
下一篇
[Day 22] 看一下Julia裡頭的unit test
系列文
When Bioinfo met Julia: Bioinformatician的30天Julia學習之路32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言