2013-09-18 4 views
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). 

Выход есть:

Привет, мир!

SUBTRACT!

Мои сомнения, почему A-B, который 15-2 = 13 не выводится на консоль?

ответ

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), потому что это последнее выражение? И, таким образом, он может быть назначен переменной.

+0

Да. Я новичок в erlang, поэтому немного смутился. Теперь я понимаю, что erlang возвращает последнее выполняемое выражение, которое происходит в вышеупомянутом случае. Спасибо – Chakri

+0

@Chakri, если ответ ответил на ваш вопрос, вы должны отметить его как принятый. Отличный ответ кстати. – user

+0

Спасибо, рад, что я могу помочь. –

1

@ a.w. это не значит, что последнее значение автоматически печатается, это оболочка , которая печатает значение вашего звонка. Так что, когда вы звоните greet_and_math(15) функция будет:

  • Вызов hello() который печатает приветствие. Его обратное значение ok от звонка до io:format игнорируется.
  • Звоните subtract(X, 3). Его возвращаемое значение 12 игнорируется.
  • Звонок add(X, 2). Его возвращаемое значение 17 затем становится возвращаемым значением всей функции.

Именно это возвращаемое значение 17 каких оболочки печатает. Итак:

  • Все возвращает значение, вы не можете вернуть значение.
  • Возврат значения и печать значения - это разные вещи.
+0

Вы правы! Конечно, он не печатается, как с использованием формата io:. Извините за то, что вы не поняли этого. Таким образом, как дополнение, можно было бы знать, что это значение (17) не видно на оболочке, когда вызывающей стороной является некоторая другая программа, которая не является оболочкой. Затем он просто возвращается вызывающему, поэтому он обрабатывает возвращаемое значение по желанию. Поэтому спасибо за добавление этого, надеюсь, это поможет читателям лучше понять, что происходит. –

+0

@ a.w. Да, я обнаружил, что иногда люди путаются о значениях печати и возвращаемых значениях, особенно в том случае, если оболочка печатает его для вас. – rvirding

Смежные вопросы