第1回先從不變的變數說開來,學過其他程式語言的人都知道,變數之所以叫變數,是因為它會經常變,被修改。假設原本X = 10,後來再執行X = 24,那麼X就從10變成了24,這對於程式新手和老鳥來說,都是永恆不變的真理。但是如果你寫Erlang程式碼還這麼認為的話,那麼你就錯了,大錯特錯,還會導致編譯失敗。現在請把你從其他程式語言學的特性忘掉,把自己變成一張白紙,讓我們回一趟小學書本,看下解方程的例子。
知識點1:變數不可變
記得上學的時候,數學老師曾說過:“如果一個等式中有好幾處X,那麼所有X都是一樣的”。舉個例子,如下:
題目:二元一次方程,請計算X和Y分別是多少?
X + Y = 10 X - Y = 2
解:
因為X - Y = 2,所以可以得出:Y = X - 2,
將Y代入第一個方程,會變成
X + X - 2 = 10,
再精簡成:
2X = 12,所以X = 12/2 = 6
Y = X - 2 = 6 - 2 = 4。
從上面的方程可以計算得出X等於6,Y等於4,那麼X還能是其他值嗎?答案是肯定不行,如果你把X改成7,那麼上面的二元一次方程怎麼算都是錯的。如果還不能理解,那麼先嚐試著接受新思想,舊思想有舊思想的好處,新思想有新思想的好處,舊的不去新的不來。
實驗1:變數不可被修改
Erlang/OTP 23 [erts-11.1.3] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [hipe] [dtrace] Eshell V11.1.3 (abort with ^G) 1> X = 6. 6 2> X. 6 3> X = 7. ** exception error: no match of right hand side value 7
X被賦值為6之後,如果再賦值為7,那麼就會報錯:no match,意思是X與7不能匹配,所以X = 6並不是賦值,而是進行了一次模式匹配。命令①表示X與6進行匹配,這次匹配是成功的,所以X繫結了6,所以X等於6。
知識點2:特殊的下劃線變數
下劃線變數會被編譯器特殊對待,既可以用來當佔位符,跳過不關心的賦值,也可以用來避免unused的編譯警告。既然是可以用來忽略不必要的賦值,那麼下劃線變數可以一直被賦值,而不會報錯。
實驗2:可以一直被賦值的下劃線變數
Erlang/OTP 23 [erts-11.1.3] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [hipe] [dtrace] Eshell V11.1.3 (abort with ^G) 1> _ = 10. 10 2> _ = 24. 24 3> _. * 1: variable '_' is unbound
下劃線第一次被賦值為10,第二次被賦值為24,不會報錯,驗證了上面說的結論:可以一直被賦值。
但是當我們要把下劃線列印出來的時候,會得到一個錯誤資訊,意思是下劃線沒有被繫結,所以證明了下劃線只是忽略了一次賦值(匹配)。
在Erlang程式設計中,一切皆是模式匹配,無處不在,幾乎每一行程式碼都會應用模式匹配,以後的每一回會對不同的資料型別進行模式匹配的實踐。
下一回將介紹模組(Module)的使用,且聽下回分解。