如何在ERLANG上使用两个以上的参数调用打印函数?

jv2fixgn  于 2022-12-08  发布在  Erlang
关注(0)|答案(2)|浏览(212)

所以我写了一个程序,它有一个字符串参数,输出如下:

-module(sayhi).

-export([sayhi/1]).

sayhi({greeting, Greeting}) -> io:fwrite(Greeting).

然后调用如下函数(从终端)。

c(sayhi).

ok
sayhi:sayhi({greeting, "HELLO!\n"}).
HELLO!
ok

直到现在一切都好。
但是当我尝试实现2个参数时,我得到错误:***参数1:参数数目错误
下面是我的代码:

-module(sayhi).

-export([sayhi/2]).
    
sayhi({greeting, Greeting}, {name, Name}) -> io:fwrite(Greeting, Name).

调用函数时:

sayhi:sayhi({greeting, "Hola "}, {name, "Sam"}).

程序运行成功,但没有给予我所需的输出。问题是来自我调用函数的语句吗?
如果我有3个,甚至10个参数呢?

ux6nzvsh

ux6nzvsh1#

Erlang有一个关于其所有内置函数的全面文档,例如io:fwrite/1, io:fwrite/2, io:fwrite/3(可以在这里找到)。
如果你想使用带1个参数的函数,那么你可以这样调用它:

io:fwrite(Greeting ++ Name). %% '++' is nothing but appending strings
io:fwrite(Greeting ++ Name ++ NextParam1 ++ NextParam2). %% You can then expand it as needed

使用2个参数时,即write(Format, Data),则:

io:fwrite("~s~s", [Greeting, Name]).
io:fwrite("~s~s~s~s", [Greeting, Name, NextParam1, NextParam2]). %% You can also expand as needed
57hvy0tb

57hvy0tb2#

您也可以利用Erlang所称的iolist,这是一个包含特定类型的列表,可以是字符串,对于iolist,Erlang将列表作为一个字符串输出。例如:

-module(a).
-compile(export_all).
    
sayhi({greeting, Words})->
    io:format(Words)

在 shell 中:

6> c(a).                                   
a.erl:2:2: Warning: export_all flag enabled - all functions will be exported
%    2| -compile(export_all).
%     |  ^

    {ok,a}

7> a:sayhi({greeting, ["Hello ", "Jim!"]}).
Hello Jim!ok

io:format()返回ok,这就是你在字符串末尾看到的内容。这不是最好的解决方案,因为你必须在单词之间添加空格(注意"Hello "中的空格)。一个更好的解决方案是在单词之间自动添加空格,然后在末尾添加一个换行符,这样ok就在单独的一行上:

-module(a).
-compile(export_all).

sayhi({greeting, Words})->
    WordsWithSpaces = add_spaces(Words, []),
    io:format(WordsWithSpaces).

add_spaces([Word | []], Acc) ->
    lists:reverse([$\n, Word | Acc]);
add_spaces([Word | Words], Acc) ->
    add_spaces(Words, [" ", Word | Acc]).

在 shell 中:

18> c(a).
a.erl:2:2: Warning: export_all flag enabled - all functions will be exported
%    2| -compile(export_all).
%     |  ^

{ok,a}

19> a:sayhi({greeting, ["Hello", "Jim!", "Now", "goodbye!"]}).
Hello Jim! Now goodbye!
ok

相关问题