在Erlang中,我想获取包含n个元素的列表的第x-n个元素。我可以使用lists:nth/2
,但是这个在x> n时会抛出一个错误,我希望得到一个默认值(在这种情况下为[]
)。列表元素获取
有没有一种内置的方式来做到这一点,而不必检查列表的长度?
在Erlang中,我想获取包含n个元素的列表的第x-n个元素。我可以使用lists:nth/2
,但是这个在x> n时会抛出一个错误,我希望得到一个默认值(在这种情况下为[]
)。列表元素获取
有没有一种内置的方式来做到这一点,而不必检查列表的长度?
的区别不幸的是没有,没有一个BIF或NIF可能会为你做这个。你最好的办法是写一个带警卫的小包装函数来检查长度。例如:
F = fun (N, L) when N > length(L) -> [];
(N, L) -> lists:nth(N,L) end.
我唯一担心在警卫中使用“长度(L)”是因为“长度”必须遍历整个列表才能确定长度。如果列表很长,即使您想要的只是第一个元素,也需要一些时间。例如,'Short = lists:seq(1,10).'和'Long = lists:seq(1,10000000).'在我的笔记本电脑上有以下'timer:tc(erlang,length,[Short]) 。 => {4,10}'与'timer:tc(erlang,length,[Long])。 => {17085,10000000}' – GuessBurger
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>
我使用标记的返回值,使{ok,[]} = N(2,[a,[],b]).
和{error,[]} = N(500,[a]).
我建议构建您自己的函数来实现此行为。 –
不幸的是,有BIF或NIF可能会为你做到这一点。你最好的办法是写一个带警卫的小包装函数来检查长度。 – matov
就我所能研究的,看起来像@matov就在这里。你能把它作为答案张贴,所以我可以关闭它吗? –