Erlang中的变量

Erlang中的变量,erlang,Erlang,我有一个非常简单的Erlang程序: -module(test). -export([start/0]). Code = "Z00887". start() -> io:fwrite(Code). 我有两个错误: c:/erl6.1/dev/test.erl:4:前面的语法错误:Code c:/erl6.1/dev/test.erl:5:变量“Code”未绑定 能否请您帮助我正确使用代码中的变量。您定义的变量是模块的全局变量,这是不允许的。请记住,Erlang中的“变量”实际上是“符

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

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

Code = "Z00887". 
start() -> io:fwrite(Code).
我有两个错误:

c:/erl6.1/dev/test.erl:4:前面的语法错误:Code
c:/erl6.1/dev/test.erl:5:变量“Code”未绑定


能否请您帮助我正确使用代码中的变量。

您定义的变量是模块的全局变量,这是不允许的。请记住,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一样对原型友好。

使用
-define(Const,Replacement)。
宏,如果您想在方法之外定义一个常量,或者执行以下操作:
start()->code=“Z00887”,io:fwrite(code)。
非常感谢您的可能重复!start()->Code=“Z00887”,io:fwrite(代码)。是工作@Legosca并非重复,但对于没有类似于Erlang语言背景的初学者来说,这是一个类似的困惑点(上面的问题代码非常接近另一个初学者的困惑点:io:fwrite/1的使用)。这里有一个不同但密切相关的问题,有着可靠的答案: