목록이 단지 문자열인지 문자열 목록인지 어떻게 결정할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/1406173

  •  05-07-2019
  •  | 
  •  

문제

문자열 목록이나 단지 문자열을 포함 할 수있는 변수가 있습니다. 내가 어떤 종류를 다루고 있는지 말할 수있는 좋은 방법이 있습니까?

"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.

플랫 유니 코드 목록을 테스트하려면 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 소스 코드를 검색하고 필요한 새로운 기능을 얻으십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top