erlang中变量作用域

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

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现在都是安全的变量了吧。 
好的,变量作用域相关的介绍暂时就这么多了。

时间: 2024-11-05 19:05:36

erlang中变量作用域的相关文章

PHP和JS中变量作用域

一,PHP中变量作用域 对于大多数PHP的变量只有一个作用域.在用户自定义函数里采用局部变量作用域.所有的函数内使用的变量被设置为局部变量.例如: <?php $a=1; function test() { echo $a; } test(); ?> 这段程序不会输出任何的东西因为echo语句要输出局部变量 $a ,而函数内的 $a 从未被赋过值.你可能注意到和C语言有点小小的区别,C中全局变量可以直接在函数内引用,除非它被一个局部变量所覆盖.因为这使得人们可能不注意修改了全局变量的值.在PH

HTML5 | Canvas中变量作用域与setInterval()方法的影响

Demo - 随机绘制圆环 实现思路: 将一个圆环的绘制分成100份,setInterval()方法定义每隔时间n绘制一段新的,每份的开始路径都是上一次的结束路径,实现步进绘制. 通过Math.random(),随机生成圆的坐标半径颜色. 实现方法: 定义画布和联系 设置步进属性 设置随机圆属性(5个参数:x,y,半径,开始,结束,方向) 循环执行绘画 <<index.html>> <!DOCTYPE html> <html> <head> &l

Javascript中变量作用域

1 <script type="text/javascript"> 2 var a = 10; 3 4 var Bar = (function () { 5 console.log(a); //undefine 6 var a = 20; 7 return function () { a += 1; console.log(a); }; 8 })(); 9 Bar(); 10 Bar(); 11 </script> 看上面一段代码,当声明全局变量a后,在函数表达

vba中变量作用域

参考:http://club.excelhome.net/thread-1237085-1-1.html 全局变量例子public 变量1 AS IntegerSub LLL()变量1 = 1111End Sub 模块级变量例子DIM 变量1 AS IntegerSub LLL()变量1 = 1111End Sub 参考:http://www.excelpx.com/thread-334103-1-1.html 我有a.b.c三个宏模块,每个里面都有一个变量 dim sj as date, 这三

对Java中变量作用域理解

昨天写一个java小程序测试与oracle数据库的连接,小程序如下: package com.test; import java.sql.*; public class procedure { public static void main(String[] args) { try { Class.forName("oracle.jdbc.driver.OracleDriver"); Connection ct=DriverManager.getConnection("jdb

php学习笔记4--php中的变量作用域

变量作用域:可以简单地理解为变量的可见区域,变量能被访问的范围.如同其他语言,php中也有全局作用域和局部作用域之分,但是不同的是:php中的全局作用域指的是:只能在函数外部使用,而局部作用域指的是:只能在函数内部使用.php中的全局变量指的是:在函数外部定义,一般来说只能在函数外部被访问,不能直接在函数内部可见的变量:而局部变量指的是:在函数内部定义,只能在函数内部访问的变量.$name = "csc";function test(){ echo $name; //运行该脚本则会提示

注意for循环中变量的作用域

for e in collections: pass 在for 循环里, 最后一个对象e一直存在在上下文中.就是在循环外面,接下来对e的引用仍然有效. 这里有个问题容易被忽略,如果在循环之前已经有一个同名对象存在,这个对象是被覆盖的. 如果在有代码感知的IDE中, IDE会提示变量是“被重新声明的”, 但运行时却不会出错. for循环不是闭包,可以使用dis模块分解以下代码可以看到: x = 5 for x in range(10): pass print x 将代码保存到test.py文件,运

JavaScript 中变量、作用域和内存问题的学习

这是我学习JavaScript的第二篇文章,之前做过几年的Java开发,发现JavaScript虽然也是面向对象的语言但是确实有很多不同之处.就本篇博客,主要学习总结一下最近学习到的JavaScript的知识,其中有些是网络上的,不过对于理解JavaScript,和在工作总是会很实用的,所以总结了下来: 那么就开始吧,首先是变量 在JavaScript中变量分为两种:一种是基本类型,基本类型值在内存中占用固定大小的空间,因此被保存在栈内存中.从一个变量向另一个变量复制基本类型的值,会创建这个值的

Python中变量的作用域(variable scope)

http://www.crifan.com/summary_python_variable_effective_scope/ 解释python中变量的作用域 示例: 1.代码版 1 #!/usr/bin/python 2 # -*- coding: utf-8 -*- 3 """ 4 ------------------------------------------------------------------------------- 5 Function: 6 [整理