erlang中變數作用域

2022-09-15 11:36:13 字數 2396 閱讀 8697

_開頭(包括_)在erlang可以是表明,這個變數可以存任意東西,就是我們常說的全匹配,_a一般來說就是表明這個東西我拉出來了,是某某東西,但是我沒用到,這一般就用_a,a就是要麼就繫結變數,要麼就匹配變數咯,這要視乎a有否被繫結過而定。

唯一的區別就是_a你下面沒呼叫 make的時候不會報warnning

如果是a下面沒呼叫 make的時候會報warrning

就這樣,_a和_基本上一樣的,都是不打算處理或者沒有用的匹配佔位符,如果怕將來忘記這裡到底是什麼資料或者有可能呼叫處理的話就寫_arg1之類。

_a 是為了當不用 _a 這個量時不會報 variable unuse 的warning ,你之後還是可以使用這個 variable(變數) 的。a就是普通的 variable (變數) 了。

erlang中變數只能一次賦值,這麼「苛刻「的要求下,更別想擁有全域性變數了。 

變數只在function中存在,這就是函式程式語言的特色。 

對於函式引數對應的變數從執行函式開始,到函式執行結束(從咱們程式設計者的角度來看的確如此,至於從執行時,gc的角度看,咱們就不深究了)。 

比如下面的函式: 

erlang**  

test1(v) ->  

io:format("v is:~p~n", [v]),  

% .... other routine  

v.  

test執行,v進行pattern match,繫結數值,隨後進入函式體,執行各種操作。最後test返回,v也就結束了其使命。 

如果變數是在函式體內部宣告,那麼在其宣告後知道函式結束均可使用,比如 

erlang**  

test2() ->  

% do something  

% ....  

v = 10,  

io:format("v is:~p~n", [v]),  

% ....  

v.  

在erlang中fun也是一種資料型別,如果我在函式中定義乙個fun,他們之間的引數關係如何呢?函式中匿名函式的引數會把所在函式的同名引數給遮蔽! 

是不是有點羅嗦?看例子: 

erlang**  

test3(v) ->  

f = fun(v) -> % 這個v會遮蔽掉test3/1的引數v!  

io:format("i'm v in fun:~p~n", [v])  

end,  

f(1),  

f(v).  

這裡f匿名函式的v會遮蔽掉test3/1的v,如果你真的想使用test3/1的引數怎麼辦呢?別糊塗了,直接把f匿名函式的引數改個名字就結了,比如f = fun(v2)... 我寫**時還真有糊塗的時候。 

關於遮蔽變數,編譯器會提醒你:variable 'v' shadowed in 'fun',多麼貼心的編譯器。(這個對應乙個編譯器選項:warn_shadow_vars 預設編譯存在) 

關於變數我還有最後乙個注意需要說明,那就是不要寫」不安全的變數「,什麼意思?看下面這個例子 

erlang**  

test4(v) when is_integer(v) ->  

if  

v >= 0 ->  

t1 = -v;  

v   

t2 = -v  

end,  

io:format("t1 is:~p~n", [t1]),  

io:format("t2 is:~p~n", [t2]).  

如果你編譯這個**片段,編譯器肯定要說: 

variable 't1' unsafe in 'if' ... 

variable 't2' unsafe in 'if' ... 

人家說,你的t1,t2都不是安全的變數!因為你的t1,t2的存在依賴與v的數值,如果v大於等於0,那麼t2就不會繫結數值,如果v小於0,那麼t1就不會繫結數值, 

因此你的t1和t2都有可能不存在,能讓這樣的**編譯通過,那erlang肯定是睡著了。怎麼修改呢?方法只有乙個:讓變數安全。 

我們讓所有的if的子句(guard seq)中都有某個變數,那麼不論你在if中執行路徑如何,我都能存在就ok了。 

erlang**  

test4(v) when is_integer(v) ->  

if  

v >= 0 ->  

t1 = -v,  

t2 = 0;  

v   

t1 = 0,  

t2 = -v  

end,  

io:format("t1 is:~p~n", [t1]),  

io:format("t2 is:~p~n", [t2]).  

編譯一下,怎麼樣,我們的t1,t2現在都是安全的變數了吧。 

好的,變數作用域相關的介紹暫時就這麼多了。

python中變數作用域

塊級作用域 if true a 10 變數沒有塊級作用域 print a 區域性作用域 只能在某一時刻才能使用 全域性作用域 num 20 def show 全域性變數在函式內部使用時,不能更改,num 10是你自己定義的變數 num 10 print num show print num 若更改需...

Python中變數作用域

在def中定義的變數都是區域性變數 def foo a 200print a def fooo a a 300print a fooo foo 執行得到 unboundlocalerror local variable a referenced before assignment也就是說在函式foo...

作用域,變數作用域,作用域鏈知識

第2章 變數作用域 第3章 作用域鏈 預覽 1.全域性作用域 整個script標籤下 或者是單獨的js檔案 外部js 2.區域性作用域也叫 函式作用域 在函式內部就是區域性作用域 這個 的名字 變數 只在函式內部起作用和效果 3.不同作用域下,定義相同變數名是不衝突的。如果是在同一作用域宣告2個相同...