我有一个非常简单的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'未绑定
请帮我正确使用代码中的变量。
答案 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一样原型友好。