没有调用erlang方法

时间:2013-09-18 10:08:41

标签: erlang erlang-shell

您好我有一个示例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).

输出是:

你好,世界!

SUBTRACT!

17

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

2 个答案:

答案 0 :(得分: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
在这种情况下,okio: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)是多少,因为它是最后一个表达式?因此可以将其分配给变量。

答案 1 :(得分:1)

@ A.W。并不是最后一个值是自动打印的,它是 shell打印你所做的调用的值。因此,当您致电greet_and_math(15)时,该功能将会:

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

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

  • 一切都返回一个值,你不能返回一个值。
  • 返回值并打印值是非常不同的事情。