2017-03-23 141 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]).