Erlang那些事兒第1回之我是變數,一次賦值永不改變

snowcicada發表於2020-12-20

  第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)的使用,且聽下回分解。

  

 

  作者:snowcicada
  本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。

相關文章