我有一個變量,可以包含一個字符串列表或只是一個字符串。有沒有一種很好的方式來說明我正在處理的是什麼?如何確定列表是否只是一個字符串或字符串列表?
"192.168.1.18" vs. ["192.168.1.18", "192.168.1.19"]
無論哪種情況,我都想使用相關位。
我有一個變量,可以包含一個字符串列表或只是一個字符串。有沒有一種很好的方式來說明我正在處理的是什麼?如何確定列表是否只是一個字符串或字符串列表?
"192.168.1.18" vs. ["192.168.1.18", "192.168.1.19"]
無論哪種情況,我都想使用相關位。
它是如何你做很大程度上取決於你打算用什麼樣的結果呢,或者說你打算怎麼辦呢。所以,如果你在位有興趣:
case MyVar of
[First|Rest] when is_list(First) -> ... First,Rest ...;
_ -> ... MyVar ...
end
,或者如果你不感興趣,實際上是拉開弦的弦/列表你可以這樣做:
if is_list(hd(MyVar)) -> ... ;
true -> ...
end
有我的理解是否正確嗎?我沒有寫任何代碼來檢查字符串應該是什麼字符串,這應該早些完成。 另一種方法是在生成此字符串/字符串列表時始終將其放入其中一種格式中。
我有時會寫一些東西,如:
case X of
[List|_] when is_list(List) ->
list_of_lists;
List when is_list(List) ->
list;
_ ->
not_a_list
end
Erlang實現了不同的函數來測試列表是否是模塊io_lib中的扁平列表。
檢查您的格外IP串的一個好的選擇是io_lib:latin1_char_list(期限) http://erlang.org/doc/man/io_lib.html#latin1_char_list-1
io_lib:latin1_char_list/1功能的實現是:
latin1_char_list([C|Cs]) when is_integer(C), C >= $\000, C =< $\377 ->
latin1_char_list(Cs);
latin1_char_list([]) -> true;
latin1_char_list(_) -> false.
如果你想測試平板的unicode列表中,您可以使用 io_lib:char_list(期限) http://erlang.org/doc/man/io_lib.html#char_list-1
io_lib:char_list/1功能的實現是:
char_list([C|Cs]) when is_integer(C), C >= 0, C < 16#D800;
is_integer(C), C > 16#DFFF, C < 16#FFFE;
is_integer(C), C > 16#FFFF, C =< 16#10FFFF ->
char_list(Cs);
char_list([]) -> true;
char_list(_) -> false.
檢查io_lib模塊文檔以獲取其他類似功能。
注意如果一些新的Erlang函數從當前項目所支持的Erlang版本丟失,你可以簡單地複製實現新的Erlang版本提供,並將其添加到您自己的模塊。搜索最新的erlang/lib/*/src源代碼,只需獲取所需的新功能。
我想最好的辦法是避免這種情況。例如。即使只有一個元素,也要使用元素列表。或者使用元組來表示IP而不是使用字符串。總是有一種方法可以避免模糊 – gleber 2009-09-10 16:18:51
gleber:同意,但現在我很遺憾地處理遺留代碼,我不能介紹這種變化 – Fylke 2009-09-10 16:45:14