我正在阅读SašaJurić的"Elixir in Action"一书,在第一章中它说:
Erlang进程完全相互隔离.它们不共享内存,一个进程崩溃不会导致其他进程崩溃.
Java线程也不是这样吗?我的意思是当Java线程崩溃时,它也不会崩溃其他线程 - 特别是,如果我们正在查看请求处理线程(让我们main
从这个讨论中排除线程)
在 Erlang 中以 end 和 ok 结束函数有什么区别?我一直在试图理解以下代码中的含义:
-module(esOne).
-export([start/1, func/1]).
start(Par) ->
io:format("Client: I am ~p, spawned by the server: ~p~n",[self(),Par]),
spawn(esOne, func, [self()]),
Par ! {onPid, self()},
serverEsOne ! {onName, self()},
receiveMessage(),
ok.
receiveMessage() ->
receive
{reply, N} ->
io:format("Client: I received a message: ~p~n",[N])
after
5000->
io:format("Client: I received no message, i quit~n",[])
end.
func(Parent)->
io:format("Child: I am ~p, spawned from ~p~n",[self(),Parent]).
Run Code Online (Sandbox Code Playgroud)
此代码与充当服务器的另一个 .erl 文件结合使用。我只能通过分析给定的服务器文件并复制它的行为来编写这个。首先,我认为 ok 用于结束每个函数,但事实并非如此,因为我不能用 ok 结束 receiveMessage()。然后我想我可以用 end 结束每个函数,但是如果我用 end 替换 ok,start(Par) 会出错。不仅如此,在服务器文件中,我看到 ok 和 …
我想编写一个函数来检查输入是否是字符串,如下所示:
is_string(Input) ->
case check_if_string(Input) of
true -> {ok, Input};
false -> error
end.
Run Code Online (Sandbox Code Playgroud)
但我发现检查输入是否是Erlang中的字符串是很棘手的.Erlang中的字符串定义在这里:http://erlang.org/doc/man/string.html.
有什么建议?
提前致谢.
我一直在探索Erlang的wx
模块和本教程.我之前没有使用过wxwidgets,所以也许这就是它的完成方式,但这段代码对我来说真的很糟糕:
%% create widgets
T1001 = wxTextCtrl:new(Panel, 1001,[]),
ST2001 = wxStaticText:new(Panel, 2001,"Output Area", []),
B101 = wxButton:new(Panel, 101, [{label, "&Countdown"}]),
B102 = wxButton:new(Panel, ?wxID_EXIT, [{label, "E&xit"}]),
wxFrame:show(Frame),
Run Code Online (Sandbox Code Playgroud)
人们是否真的必须在创建小部件时为其分配小部件ID?在窗口小部件ID之后命名指向窗口小部件的变量是否正常?
检查一个新的R17功能,地图的文档,带我到地图:删除/ 2和地图:没有/ 2.我能看到的唯一明显区别是remove/2只接受一个键并返回一个没有它的地图视图,其中没有/ 2接受一个列表并返回一个缺少列出的键的全新地图.
22> M1 = #{foo => bar, spam => eggs}.
#{foo => bar,spam => eggs}
23> M2 = maps:without([foo], M1).
#{spam => eggs}
24> M3 = maps:remove(foo, M1).
#{spam => eggs}
25> M1.
#{foo => bar,spam => eggs}
26> M2.
#{spam => eggs}
27> M3.
#{spam => eggs}
Run Code Online (Sandbox Code Playgroud)
这有什么实际影响?我可以欣赏不想创建没有/ 2的巨型地图的内存副本,但为什么不删除/ 2接受列表?我假设存在一个以性能为导向的原因,为什么这两个函数以它们的方式存在,但是我很困惑何时我想在大多数情况下使用一个而不是另一个(意思是,我不认为维护巨大的地图通常是个好主意).
我越来越多地了解Erlang语言并且最近遇到了一些问题.我读到了关于foldl(Fun, Acc0, List) -> Acc1
功能.我使用了learnyousomeerlang.com教程并且有一个例子(例子是关于Erlang中的反向波兰表示法计算器):
%function that deletes all whitspaces and also execute
rpn(L) when is_list(L) ->
[Res] = lists:foldl(fun rpn/2, [], string:tokens(L," ")),
Res.
%function that converts string to integer or floating poitn value
read(N) ->
case string:to_float(N) of
%returning {error, no_float} where there is no float avaiable
{error,no_float} -> list_to_integer(N);
{F,_} -> F
end.
%rpn managing all actions
rpn("+",[N1,N2|S]) -> [N2+N1|S];
rpn("-", [N1,N2|S]) -> [N2-N1|S];
rpn("*", [N1,N2|S]) -> [N2*N1|S];
rpn("/", [N1,N2|S]) -> [N2/N1|S];
rpn("^", [N1,N2|S]) -> …
Run Code Online (Sandbox Code Playgroud) 我有一个GenServer
通过连接到远程TCP连接的gen_tcp
。
opts = [:binary, active: true, packet: :line]
{:ok, socket} = :gen_tcp.connect('remote-url', 8000, opts}
我正在处理以下消息:
def handle_info({:tcp, socket, msg}, stage) do
IO.inspect msg
{:noreply, state}
end
哪个很棒。但是,TCP服务器容易超时。如果使用gen_tcp.recv
,则可以指定超时。但是,我使用active: true
来接收消息handle_info
,而不必遍历和调用recv
。因此,GenServer
即使服务器已超时,也愉快地等待下一条消息。
GenServer
如果X秒后仍未从TCP连接接收到消息,该如何触发函数?我会坚持使用recv
吗?