_開頭(包括_)在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個相同...