2014-09-10 65 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一樣是原型友好的。