在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就在這裏。你能把它作爲答案張貼,所以我可以關閉它嗎? –