【问题标题】:erlang method not called没有调用erlang方法
【发布时间】:2013-09-19 06:46:26
【问题描述】:

您好,我有一个示例 erlang 代码,

%%file_comment
-module(helloworld).
%% ====================================================================
%% API functions
%% ====================================================================
-export([add/2,subtract/2,hello/0,greet_and_math/1]).
%% ====================================================================
%% Internal functions
%% ====================================================================
add(A,B)->
A+B.

subtract(A,B)->
io:format("SUBTRACT!~n"),
A-B.

hello()->
io:format("Hello, world!~n").

greet_and_math(X) ->
hello(),
subtract(X,3),
add(X,2).

当我跑步时

helloworld:greet_and_math(15).

输出是:

你好,世界!

减去!

17

我的疑问是为什么 15-2=13 的 A-B 没有打印在控制台上?

【问题讨论】:

    标签: erlang erlang-shell


    【解决方案1】:

    那是因为您从未打印 15-2。您需要的代码如下所示:

    %%file_comment
    -module(helloworld).
    %% ====================================================================
    %% API functions
    %% ====================================================================
    -export([add/2,subtract/2,hello/0,greet_and_math/1]).
    %% ====================================================================
    %% Internal functions
    %% ====================================================================
    add(A,B)->
    A+B.
    
    subtract(A,B)->
    io:format("SUBTRACT!~n"),
    io:format("~p~n", [A-B]).   % this will make sure A-B is printed to console
    
    hello()->
    io:format("Hello, world!~n").
    
    greet_and_math(X) ->
    hello(),
    subtract(X,3),
    add(X,2).
    

    这会给你:

    Hello, world!
    SUBTRACT!
    12
    17
    

    如果你想知道为什么会打印17,那是因为它是最后一个表达式。这个总是在执行代码后打印到控制台,因为它实际上是您的代码返回的内容。只需在控制台上执行io:format("hello~n").,您就会看到:

    hello
    ok
    

    ok在这种情况下是由io:format返回的,因为它是最后一个表达式,所以会被打印出来。

    io:format("hello~n"),
    io:format("world~n").
    

    将导致:

    hello
    world
    ok
    

    在控制台上只能看到第二个 io:format 返回的最后一个 ok
    我希望您了解它的工作原理。

    所以在你的情况下,输入:

    4> A = helloworld:greet_and_math(15).
    Hello, world!
    SUBTRACT!
    17
    5> A.
    17
    6> 
    

    你看到17greet_and_math(15) 返回的值,因为它是最后一个表达式吗?因此它可以分配给一个变量。

    【讨论】:

    • 是的。我是erlang的新手,所以我有点困惑。现在我知道 erlang 返回执行的最后一个表达式,这在上述情况下发生。谢谢
    • @Chakri 如果答案回答了您的问题,您应该将其标记为已接受。顺便说一句,答案很好。
    • 谢谢,很高兴能为您提供帮助。
    【解决方案2】:

    @a.w.不是自动打印最后一个值,它是 shell 打印您调用的值。因此,当您调用 greet_and_math(15) 时,该函数将:

    • 致电hello() 打印问候语。忽略对 io:format 的调用返回的 ok 值。
    • 致电subtract(X, 3)。其返回值12 被忽略。
    • 致电add(X, 2)。然后它的返回值17就变成了整个函数的返回值。

    shell 打印出的是17 的返回值。所以:

    • 一切都返回一个值,你不能不返回一个值。
    • 返回值和打印值是完全不同的事情。

    【讨论】:

    • 你是对的!当然它不像使用 io:format 那样打印。很抱歉没有让这个更清楚。因此,作为进一步的补充,当调用者是其他一些不是 shell 的程序时,人们可能知道这个值 (17) 在 shell 上看不到。然后它只是返回给调用者,因此它根据需要处理返回值。感谢您添加此内容,希望它可以帮助读者更好地了解正在发生的事情。
    • @a.w.是的,我发现有时人们确实对打印值和返回值感到困惑,尤其是当 shell 为您打印它时。
    猜你喜欢
    • 1970-01-01
    • 2015-04-18
    • 2023-03-09
    • 2012-03-13
    • 2012-08-25
    • 2015-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多