我有一个非常简单的Erlang程序:
-module(test).
-export([start/0]).
Code = "Z00887".
start() -> io:fwrite(Code).
Run Code Online (Sandbox Code Playgroud)
我有两个错误:
c:/erl6.1/dev/test.erl:4:语法错误之前:代码
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]).
Run Code Online (Sandbox Code Playgroud)
您也可以直接使用该值:
-module(foo).
-export([start/0]).
start() ->
io:fwrite("Z00887~n").
Run Code Online (Sandbox Code Playgroud)
或者您可以在整个模块中定义一个宏:
-module(foo).
-export([start/0]).
-define(CODE, "Z00887").
start() ->
io:fwrite("~p~n", [?CODE]).
Run Code Online (Sandbox Code Playgroud)
或者你甚至可以定义一个返回你想要的存根函数:
-module(foo).
-export([start/0]).
start() ->
io:fwrite("~p~n", [code()]).
code() -> "Z00887".
Run Code Online (Sandbox Code Playgroud)
最后一个版本实际上并不像最初看起来那样奇怪.通常在早期开发某些代码时,您会知道某个地方需要某个值,但您不需要担心它的细节.存根函数是隐藏未来如何执行此操作的详细信息的绝佳方法,无需编写宏代码,变量定义等,您必须记住以后再返回并进行更改.例如,上面的最后一个例子几乎肯定会在未来改变为类似的东西:
-module(foo).
-export([start/0]).
start() ->
io:fwrite("~p~n", [code()]).
code() ->
{ok, Code} = some_init_module:get_code(),
Code.
Run Code Online (Sandbox Code Playgroud)
记住这一点.它使Erlang几乎像Guile或Scheme一样原型友好.