Erlang 列表元素获取
在Erlang中,我想获取包含n个元素的列表的第x-n个元素。我可以使用Erlang 列表元素获取,erlang,Erlang,在Erlang中,我想获取包含n个元素的列表的第x-n个元素。我可以使用列表:nth/2,但是当x>n时,这个列表会抛出一个错误,我希望得到一个默认值([],在这种情况下) 有没有一种不必检查列表长度的内置方法可以做到这一点?1>N=fun(Pos,list)-> 1> N = fun(Pos,List) -> 1> try 1> {ok,lists:nth(Pos,List)} 1> catch
列表:nth/2
,但是当x>n时,这个列表会抛出一个错误,我希望得到一个默认值([]
,在这种情况下)
有没有一种不必检查列表长度的内置方法可以做到这一点?1>N=fun(Pos,list)->
1> N = fun(Pos,List) ->
1> try
1> {ok,lists:nth(Pos,List)}
1> catch
1> _:_ -> {error,[]}
1> end
1> end.
#Fun<erl_eval.12.52032458>
2> N(2,[1,2,3,4]).
{ok,2}
3> N(5,[1,2,3,4]).
{error,[]}
4>
1> 试一试
1> {好的,列表:n(Pos,List)}
1> 抓住
1> {错误,[]}
1> 结束
1> 结束。
#乐趣
2> N(2,[1,2,3,4])。
{好的,2}
3> N(5,[1,2,3,4])。
{错误,[]}
4>
我使用带标记的返回值来区分
{ok,[]}=N(2,[a,[],b])。
和{error,[]}=N(500,[a])。
不幸的是,没有BIF或NIF可以为您做到这一点。最好的办法是编写一个带有保护的小包装函数来检查长度。比如:
F = fun (N, L) when N > length(L) -> [];
(N, L) -> lists:nth(N,L) end.
我建议您构建自己的函数来实现这种行为。不幸的是,没有BIF或NIF可以为您做到这一点。你最好的办法是写一个带保护的小包装函数来检查长度。据我所知,@matov就在这里。你能把它作为一个答案贴出来吗?AsierAzkuenaga谢谢,贴出了我的答案我唯一关心的是在警卫中使用
length(L)
,因为length
必须遍历整个列表才能确定长度。如果列表很长,这可能需要一些时间,即使您只需要第一个元素。例如,Short=lists:seq(1,10)。
和Long=lists:seq(110000000)。
在我的笔记本电脑上,我有以下计时器:tc(erlang,length,[Short])。=>{4,10}
与计时器:tc(erlang,length,[Long])=>{1708510000000}