Erlang的新手:添加了IF,vars没有用?

bat*_*man 1 variables erlang tuples list

有谁擅长调试Erlang?我无法弄清楚我的生活有什么不对.无论我把Fields变量放在哪里,Erlang都说在那行之前有一个错误......

编译消息:

./eventbus.erl:6: syntax error before: FieldPositions
./eventbus.erl:24: variable 'FieldPositions' is unbound
./eventbus.erl:28: Warning: variable 'Ref' is unused
./eventbus.erl:30: Warning: variable 'List' is unused
error
Run Code Online (Sandbox Code Playgroud)

然后是代码本身.

-module(secret).
-export([listen/1, send/1]).

-define(TCP_OPTIONS, [binary, {packet, 0}, {active, false}, {reuseaddr, true}]).

FieldPositions = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","AA","BB","CC","DD","EE","FF","GG","HH","II","JJ","KK","LL","MM","NN","OO","PP"].


listen(Port) ->
    {ok, LSocket} = gen_tcp:listen(Port, ?TCP_OPTIONS),
    accept(LSocket).

accept(LSocket) ->
    {ok, Socket} = gen_tcp:accept(LSocket),
    spawn(fun() -> loop(Socket) end),
    accept(LSocket).    

discrim(<<>>) ->
    ok;
discrim([]) ->
    ok;
discrim(Info) ->
    EventsList = string:tokens(Info,"|"),
    process_events(EventsList, FieldPositions).

process_events([],[]) ->
    ok;
process_events([],Ref) ->
    ok;
process_events(List,[]) ->
    ok;
process_events(List,Ref) ->
    [RHead|RTail] = Ref,
    [Head|Tail] = List,
    if
    Head == [] ->
        process_events(Tail, RTail);
    true ->
        io:format("message.bus ~s ~s",[RHead,Head]),
        process_events(Tail, RTail),
        ok
    end.

loop(Socket) ->
    case gen_tcp:recv(Socket, 0) of
        {ok, Data} ->
            %gen_tcp:send(Socket, Data),
            %io:format(Data),
            discrim(Data),
            io:format("~n"),
            loop(Socket);
        {error, closed} ->
            ok
    end.
Run Code Online (Sandbox Code Playgroud)

Nay*_*uki 5

您试图FieldPositions在模块级别声明一个值,这在Erlang中是不允许的.(但您可以在模块级别声明函数,或在函数内声明值.)

有许多替代方案可以达到您想要的效果:

  • 使用-define宏,就像代码中的宏一样TCP_OPTIONS.

  • 内联FieldPositions您想要使用它的值的值.

  • 写一个常量返回函数,如: field_positions() -> ["A","B",...,"PP"].

顺便说一下,根据我对各种编译器和解释器的经验,我建议你不要太过字面上的错误信息.特别是,我认为你应该把你得到的错误视为"错误发生 x行附近的某个地方 ",而不是字面意思为"在x行之前"或"在x行".

  • 当然,你甚至可以创建一个常量返回函数,如:`field_positions() - > ["A","B",...]. (5认同)