2017-03-23 30 views
0

在Erlang中,我想获取包含n个元素的列表的第x-n个元素。我可以使用lists:nth/2,但是这个在x> n时会抛出一个错误,我希望得到一个默认值(在这种情况下为[])。列表元素获取

有没有一种内置的方式来做到这一点,而不必检查列表的长度?

+0

我建议构建您自己的函数来实现此行为。 –

+1

不幸的是,有BIF或NIF可能会为你做到这一点。你最好的办法是写一个带警卫的小包装函数来检查长度。 – matov

+0

就我所能研究的,看起来像@matov就在这里。你能把它作为答案张贴,所以我可以关闭它吗? –

回答

0

的区别不幸的是没有,没有一个BIF或NIF可能会为你做这个。你最好的办法是写一个带警卫的小包装函数来检查长度。例如:

F = fun (N, L) when N > length(L) -> []; 
     (N, L) -> lists:nth(N,L) end. 
+0

我唯一担心在警卫中使用“长度(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
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]).