Erlang中的变量

时间:2014-09-10 16:01:57

标签: erlang

我有一个非常简单的Erlang程序:

-module(test).
-export([start/0]).

Code = "Z00887". 
start() -> io:fwrite(Code).

我有两个错误:

  

c:/erl6.1/dev/test.erl:4:之前的语法错误:代码
  c:/erl6.1/dev/test.erl:5:变量'Code'未绑定

请帮我正确使用代码中的变量。

1 个答案:

答案 0 :(得分:5)

您正在定义一个模块的全局变量,这是不允许的。请记住,Erlang中的“变量”实际上是“符号”,因此在所有函数或过程中都没有“全局”常量的概念。在Erlang中最接近它的是模块中定义的宏,但是如果只需要在一个地方需要一个值而你想要命名它,那么这必须在函数定义中完成。

另外,不要使用io:fwrite / 1或io:format / 1。问题是可能在您传递的字符串中包含转义字符。例如,这会导致错误:Code = "Wee~!", io:format(Code).并且编译器不会捕获它。

最常见的事情是在函数中定义一个变量:

-module(foo).
-export([start/0]).

start() ->
    Code = "Z00887",
    io:fwrite("~p~n", [Code]).

您也可以直接使用该值:

-module(foo).
-export([start/0]).

start() ->
    io:fwrite("Z00887~n").

或者您可以在整个模块中定义一个宏:

-module(foo).
-export([start/0]).

-define(CODE, "Z00887").

start() ->
    io:fwrite("~p~n", [?CODE]).

或者你甚至可以定义一个返回你想要的存根函数:

-module(foo).
-export([start/0]).

start() ->
    io:fwrite("~p~n", [code()]).

code() -> "Z00887".

这最后一个版本实际上不是,因为它看起来很奇怪。通常在早期开发某些代码时,您会知道某个地方需要某个值,但您不需要担心它的细节。存根函数是隐藏未来如何执行此操作的详细信息的绝佳方法,无需编写宏代码,变量定义等,您必须记住以后再返回并进行更改。例如,上面的最后一个例子几乎肯定会在未来改变为类似的东西:

-module(foo).
-export([start/0]).

start() ->
    io:fwrite("~p~n", [code()]).

code() ->
    {ok, Code} = some_init_module:get_code(),
    Code.

记住这一点。它使Erlang几乎像Guile或Scheme一样原型友好。