2010-06-04 4 views
2

실제 등록 목록이 아닌 속성 목록에서 레코드를 만들고 싶습니다 (예 : #xmlElement 속성). 처리해야하는 요소 목록과 가능한 속성 목록이 있습니다.등록 정보 목록에서 레코드 만들기

내가 할 수 물론 같은 것을 수행

create_record(Rec, [{attr1, Val}|As]) -> create_record(Rec#blah{attr1 = Val}, As); 
create_record(Rec, [{attr2, Val}|As]) -> create_record(Rec#blah{attr2 = Val}, As); 
... 

을하지만 조금 긴 될 것 나는 이미 (I도 record_info(fields, blah)을 사용할 수 있습니다 내가 미친 방법을 많이 볼 수 속성의 목록을 가지고있다. setelement와 실제 기록 튜플에 접근 함께 할,하지만 어쩌면 간단한 해결책이있다합니다

아마 가장 유혹 할 것

답변

2

:

create_record(Lst) -> 
    #blah{ 
     attr1=proplists:get_value(attr1, Lst, default_attr1), 
     attr2=proplists:get_value(attr2, Lst, default_attr2), 
     ... 
    }. 

이 것을 레코드로 변환하는 요점은 코드 내의 다른 곳에서 컴파일 타임에 속성의 정적 검사를 얻는 것입니다. 따라서 여기서는 간단하고 반복적 인 것에 아무런 해가 없다고 생각합니다.

원하는 경우 record_info 매직은 매우 간단하지만 record_info는 실제 함수가 아니므로이 함수는 일반적 일 수 없습니다. (매크로 일 수 있습니다.)

make_record(Lst) -> 
    list_to_tuple([blah|[proplists:get_value(X, Lst) || X <- record_info(fields, blah)]]). 

런타임에 동적 키를 원한다면 dict을 사용하십시오. 그것은 exprecs 같은 소리

3

당신을 위해 무엇을 찾고있는 사람입니다 :

http://forum.trapexit.org/viewtopic.php?p=21790

이 설명에서 읽기 :

모듈은 당신이 기록을 내보낼 수 변환 구문 분석이다. 변형은 에 대한 접근 자 함수를 추가합니다. 은 모듈간에 을 컴파일하지 않고도 레코드를 인스턴스화, 검사 및 구체화합니다.

이 정보가 도움이되는지 확인하십시오.