首页 > Erlang并发教程 > 3.28 Erlang并发编程-if、case和receive的作用域规则
2013
11-06

3.28 Erlang并发编程-if、case和receive的作用域规则

ifcasereceive的作用域规则

ifcasereceive原语中引入的变量会被隐式导出到原语主体之外。比方我们有:

f(X) ->
    case g(X) of
        true -> A = h(X);
        false -> A = k(X)
end,
...

变量A在其被定义的case原语之后仍然有效。从ifcasereceive原语中导出变量时应注意一些规则:

ifcasereceive原语的不同分支中引入的变量集合必须相同,除非缺少的变量在原语外不再被引用。

例如以下代码:

f(X) ->
    case g(X) of
        true -> A = h(X), B = A + 7;
        false -> B = 6
    end,
h(A).

这段代码就是非法的。因为在对true分支求值时定义了变量AB,而在对false分支求值时只定义了B。在case原语之后,又在调用h(A)中引用了A——如果是fase分支被求值,则A尚未被定义。注意如果调用的不是h(A)而是h(B)则这段代码就是合法的,因为Bcase原语的两个分支中都有定义。


3.28 Erlang并发编程-if、case和receive的作用域规则》有 6 条评论

  1. 静默 说:

    这个作用域到底是怎么计算的呢?在同一个函数中,行10定义了A,那么只要在10行以后,这个都是有效的?和java的区别这么大啊?

  2. 静默 说:

    我所谓的行10,就是可能在case、if、等等分支语句中定义的

  3. Erlang 说:

    你要难以理解的话,就把if当成一个 函数,case这些都是函数里面的内容,那你的这个行10定义的A就是的作用域就是”函数if”,这个和java确定有很大的区别,从别的语言跳过来会觉得各种怪异~

  4. 不错的网站,很喜欢,期待互访

  5. 很好的网站,赞一个,加油!

留下一个回复

你的email不会被公开。