Erlang中的变量
我有一个非常简单的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中的“变量”实际上是“符
-module(test).
-export([start/0]).
Code = "Z00887".
start() -> io:fwrite(Code).
我有两个错误:
c:/erl6.1/dev/test.erl:4:前面的语法错误:Codec:/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的使用)。这里有一个不同但密切相关的问题,有着可靠的答案: