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


  第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
  本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM