二郎对可读性给予了相当的重视。
模式匹配、列表理解是最好的工具,可以在不破坏可读性的情况下最小化代码。然而,在erlang中,匿名函数经常作为函数参数传入。
对我来说,读that.Is是件很烦人的事,有什么特别的原因吗?
对于一般的前人:
hhfuns:fold(fun(A,B) -> A + B end, 0, lists:seq(1,6)).发布于 2014-11-04 06:29:31
你可以用任何你喜欢的方式来处理。语法一开始可能很烦人,但您可能会习惯它。在任何情况下,您都试图将一个值传递给一个函数,就像处理任何其他参数一样。如果你记住这一点,你就会意识到你有三种方法可以做到这一点。
考虑以下示例模块:
-module(funplay).
-export([external/1, internal/1, inline/1]).
apply_foo(Foo, Thingy) -> Foo(Thingy).
add_one(N) -> N + 1.
external(X) ->
apply_foo(fun add_one/1, X).
internal(X) ->
AddOne = fun(N) -> N + 1 end,
apply_foo(AddOne, X).
inline(X) ->
apply_foo(fun(N) -> N + 1 end, X).我想不出比上面的代码更好的解释方法了。
如果我知道我将使用相同的东西(在这种情况下,我真的需要定义这个过程,而不是在任何地方匿名重写),我更喜欢外部方式。当我需要将非平凡或多行条件传递给函数时,我更喜欢内部方式(只是更容易阅读和我讨厌争论中的缩进),或者在同一个函数中需要它不止一次,我更喜欢在过滤器或折叠之类的东西中进行简单检查的内联方式。
发布于 2014-11-04 08:11:33
选择语法是一个品味的问题,或者公司的编码规则,但有趣的是这个特性的威力。下面是一个示例,我将消息中的函数发送给另一个节点,该节点依次转发到最终执行它的进程列表(请注意,我选择了匿名函数,这样做-我确信接收节点能够执行该函数):
启动2个节点:
erl -sname node1
erl -sname node2在node1上,在shell中(需要R17来使用这个语法):
Loop = fun Loop(X) -> receive
{forward, Mess} -> lists:foreach(fun(Pid) -> Pid ! Mess end, X), Loop(X);
stop -> ok
end
end.
Proc = fun Proc(X) -> receive
{do,Fun} -> Y = Fun(X), Proc(Y);
stop -> ok
end
end.
L = [spawn(fun() -> Proc(0) end) || _ <- lists:seq(1,10)].
register(server,spawn(fun() -> Loop(L) end)).在node2上:
(node2@XXX)1>net_adm:ping(node1@XXX).
pong
(node2@XXX)2> {server,node1@XXX} ! {forward,{do,fun(X) ->Self = self(), io:format("~p state is ~p~n",[Self,X]),X end}}.
{forward,{do,#Fun<erl_eval.6.90072148>}}
(node2@XXX)3> {server,node1@XXX} ! {forward,{do,fun(X) -> X + 1 end}}.
{forward,{do,#Fun<erl_eval.6.90072148>}}
(node2@XXX)4> {server,node1@XXX} ! {forward,{do,fun(X) ->Self = self(), io:format("~p state is ~p~n",[Self,X]),X end}}.
{forward,{do,#Fun<erl_eval.6.90072148>}}
(node2@XXX)4> 在node1上的结果:
<0.42.0> state is 0
<0.43.0> state is 0
<0.44.0> state is 0
<0.45.0> state is 0
<0.46.0> state is 0
<0.47.0> state is 0
<0.48.0> state is 0
<0.49.0> state is 0
<0.50.0> state is 0
<0.51.0> state is 0
<0.43.0> state is 1
<0.42.0> state is 1
<0.44.0> state is 1
<0.45.0> state is 1
<0.46.0> state is 1
<0.47.0> state is 1
<0.48.0> state is 1
<0.49.0> state is 1
<0.50.0> state is 1
<0.51.0> state is 1
(node1@XXX)5> https://stackoverflow.com/questions/26728564
复制相似问题