zoukankan      html  css  js  c++  java
  • erlang中变量作用域

    http://erlangdisplay.iteye.com/blog/315452

    _开头(包括_)在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代码  收藏代码
    1. test1(V) ->  
    2.     io:format("V is:~p~n", [V]),  
    3.     % .... other routine  
    4.     V.  


    test执行,V进行pattern match,绑定数值,随后进入函数体,执行各种操作。最后test返回,V也就结束了其使命。 

    如果变量是在函数体内部声明,那么在其声明后知道函数结束均可使用,比如 

    Erlang代码  收藏代码
    1. test2() ->  
    2.     % do something  
    3.     % ....  
    4.     V = 10,  
    5.     io:format("V is:~p~n", [V]),  
    6.     % ....  
    7.     V.  



    在erlang中fun也是一种数据类型,如果我在函数中定义一个fun,他们之间的参数关系如何呢?函数中匿名函数的参数会把所在函数的同名参数给屏蔽! 
    是不是有点罗嗦?看例子: 

    Erlang代码  收藏代码
    1. test3(V) ->  
    2.     F = fun(V) -> % 这个V会屏蔽掉test3/1的参数V!  
    3.             io:format("i'm V in fun:~p~n", [V])  
    4.             end,  
    5.     F(1),  
    6.     F(V).  



    这里F匿名函数的V会屏蔽掉test3/1的V,如果你真的想使用test3/1的参数怎么办呢?别糊涂了,直接把F匿名函数的参数改个名字就结了,比如F = fun(V2)... 我写代码时还真有糊涂的时候。 
    关于屏蔽变量,编译器会提醒你:variable 'V' shadowed in 'fun',多么贴心的编译器。(这个对应一个编译器选项:warn_shadow_vars 默认编译存在) 

    关于变量我还有最后一个注意需要说明,那就是不要写”不安全的变量“,什么意思?看下面这个例子 

    Erlang代码  收藏代码
    1. test4(V) when is_integer(V) ->  
    2.     if  
    3.         V >= 0 ->  
    4.             T1 = -V;  
    5.         V < 0 ->  
    6.             T2 = -V  
    7.     end,  
    8.     io:format("T1 is:~p~n", [T1]),  
    9.     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代码  收藏代码
    1. test4(V) when is_integer(V) ->  
    2.     if  
    3.         V >= 0 ->  
    4.             T1 = -V,  
    5.             T2 = 0;  
    6.         V < 0 ->  
    7.             T1 = 0,  
    8.             T2 = -V  
    9.     end,  
    10.     io:format("T1 is:~p~n", [T1]),  
    11.     io:format("T2 is:~p~n", [T2]).  



    编译一下,怎么样,我们的T1,T2现在都是安全的变量了吧。 
    好的,变量作用域相关的介绍暂时就这么多了。

  • 相关阅读:
    SpringBoot整合Mybatis之进门篇
    Tomcat和Java Virtual Machine的性能调优总结
    一次浴火重生的MySQL优化(EXPLAIN命令详解)
    简单聊聊不可或缺的Nginx反向代理服务器--实现负载均衡【上篇】
    Java设计模式之适配器设计模式(项目升级案例)
    前端错误监控
    三栏布局的5种方案
    prototype原型链详解
    关于mysql修改密码 set password for root@localhost = password('xxx');报错解决方法
    页面布局之三栏布局的5种方案
  • 原文地址:https://www.cnblogs.com/fvsfvs123/p/4271915.html
Copyright © 2011-2022 走看看