您正在为模块定义一个全局变量,这是不允许的。请记住,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]).
或者你甚至可以定义一个存根函数返回你wa NT:
-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(常数,更换).'宏,如果要定义一个方法 http://erlang.org/doc/reference_manual/macros.html 的恒定外或做:'开始() - >代码=“Z00887”,io:fwrite(代码).' – 2014-09-10 16:37:15
[使用Erlang模块内部的匿名函数时出现问题]的可能重复(http://stackoverflow.com/questions/18401291/trouble-when- using-anonymous-functions-inside-erlang-modules) – legoscia 2014-09-10 16:41:18
非常感谢! start() - > Code =“Z00887”,io:fwrite(Code)。是工作! – 2014-09-10 19:04:41