0

嗨,我有一个示例 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 的 AB 没有打印在控制台上?

4

2 回答 2

2

那是因为您从未打印过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

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

因此,在您的情况下,键入:

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

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

于 2013-09-18T11:23:15.957 回答
1

@aw不是自动打印最后一个值,而是打印您进行调用的值的shell 。因此,当您调用greet_and_math(15)该函数时:

  • 调用hello()打印问候语。ok它从调用到的返回值io:format被忽略。
  • 打电话subtract(X, 3)。它的返回值12被忽略。
  • 打电话add(X, 2)。then 的返回值17成为整个函数的返回值。

shell打印出来的正是这个返回值17。所以:

  • 一切都返回一个值,你不能不返回一个值。
  • 返回一个值和打印一个值是非常不同的事情。
于 2013-09-18T22:46:26.933 回答