2014-09-10 60 views
3

我有一个非常简单的Erlang程序:变量在二郎山

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

Code = "Z00887". 
start() -> io:fwrite(Code). 

而且我有如下两个错误:

c:/erl6.1/dev/test.erl:4: syntax error before: Code
c:/erl6.1/dev/test.erl:5: variable 'Code' is unbound

可否请你我正确地使用变量在我的代码帮助。

+1

使用'-define(常数,更换).'宏,如果要定义一个方法 http://erlang.org/doc/reference_manual/macros.html 的恒定外或做:'开始() - >代码=“Z00887”,io:fwrite(代码).' – 2014-09-10 16:37:15

+1

[使用Erlang模块内部的匿名函数时出现问题]的可能重复(http://stackoverflow.com/questions/18401291/trouble-when- using-anonymous-functions-inside-erlang-modules) – legoscia 2014-09-10 16:41:18

+0

非常感谢! start() - > Code =“Z00887”,io:fwrite(Code)。是工作! – 2014-09-10 19:04:41

回答

6

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