为什么我的代码发送双重消息(它发送XX而不是X)?

时间:2014-04-29 15:28:08

标签: erlang

我正在为练习做一个简单的计算器。这段代码发送一个数字。但是,当我尝试发送数字X时,它会发送XX。这就是它在控制台中的样子:

(pz@Molly)3> znamenka:send(0, prva_znamenka).
I'm about to send: 00
(pz@Molly)4>

这是相关的代码:

send(X, Name) ->
    if 
        X =:= 0 ->
            Name!X;
        X =:= 1 ->
            Name!X;
        X =:= 2 ->
            Name!X;
        X =:= 3 ->
            Name!X;
        X =:= 4 ->
            Name!X;
        X =:= 5 ->
            Name!X;
        X =:= 6 ->
            Name!X;
        X =:= 7 ->
            Name!X;
        X =:= 8 ->
            Name!X;
        X =:= 9 ->
            Name!X;
        X =:= stop ->
            Name!X;
        true ->
            io:format("You didn't enter a number or stop.")
    end.


loop() ->
    receive
        stop ->
            exit({myExit});
        X ->
            io:format("I'm about to send: ~w", [X]),
            {rjesenje, rjesenje@Molly}!{self(), X},
            loop()
    end.

2 个答案:

答案 0 :(得分:2)

你混合了2件事。首先,程序使用io:format / 2函数打印字符串。由于字符串末尾没有新行,因此shell中的光标停留在同一位置。然后函数send(X,Name)返回它的值,即if语句的结果,所以消息本身:0并在打印提示符之前添加一行。

这两件事是独立的,所以你可能会得到:

0I'm about to send: 0
(pz@Molly)4>

或:

0
I'm about to send: 0(pz@Molly)4>

我不确定订单。

如果您对io:format lite进行评论,您将看到剩余的一个0,或者如果您向发送函数添加新行,例如

end,
ok.

第二个0将被ok替换。

答案 1 :(得分:0)

io:format("I'm about to send: ~w~n", [X]),

你会发现差异。