2016-10-08 3 views
0

는 속성의 (qulified 대 정규화되지 않은) 이름에 관한 type.getAttributes (의 반환 값 사이의 불일치) 및 type.getAttribute (의 인수 값)이있는 것 같습니다 :유형 안전 메타 프로그래밍? 문자열을 사용하여 ceylon.language에 메타 정보를 문의 하시겠습니까?

만약을의 이름 getAttributes에 의해 리턴 된 속성은 예를 들어

value stringType1 = `String`; 
value stringType2 = `String`; 
for (a in stringType1.getAttributes<String,Anything,Nothing>(`SharedAnnotation`)) { 
    if(exists p = stringType2.getAttribute<String,Anything,Nothing>(a.string)) { 
     print(" > `` p ``  ");} 
} 

예상 된 결과를 생성하지 않습니다이 코드는, getAttribute를()가 예를 들어, 기대 때문 "ceylon.language :: String.reversed는"이 두 모델의 특성을 통해 압축 할 수 없습니다 getAttributes()에 의해 반환되는 "ceylon.language :: String.reversed"대신 인수 문자열로 "reversed"됩니다.

일반적으로 이러한 작업에 문자열을 사용하는 방법을 선호하지 않습니다. 하지만 하나의 단일 속성을 문자열을 사용하여 직접 쿼리하여 검색하는 유일한 방법 인 것 같습니다.

내가 볼 수있는 유일한 대안은 모든 속성을 예 : TreeSet에, 캐릭터 라인 표현 대신에 속성의 모델 표현을 비교하는 Comparator를 기술합니다. 그래서, 요구 된 속성을 적절한 순서로 꺼내어 압축합니다. 또는 zip (... getAttributes < ...> (...). sort(), ... getAttributes < ...> (...). sort())?

경우에 따라 모든 속성이 필요하지 않을 때 모두 속성을 처리해야하므로 때때로 불충분 할 수 있습니다.

작업을 재귀 적 평등의 다른 유형에 맞는 계층 구조 또는 테스트를 객체에 대한 비교 기능을 적용 할의 컬렉션 API를 유사한 방식으로 메타 정보를 노출하는 표준 API를하는 것이 바람직 할 것이다 (기준 하위 유형별, 값순, 단일성 별 ...)

메타 정보의 트리 기반 수집, 필요한 정보 만 가져 오는 선택 기능 및 비교 기능이 필요할 수 있습니다. 결국 그것은 ceylon 메타 정보를위한 일종의 LINQ가 될 것입니다.

그런 API가 이미 있거나 예정되어 있거나 자체 구현을하기 위해 사용자에게 맡기고 있는지 궁금합니다.

실제로 이해할 수없는 것은 문자열이 ceylon.language에 메타 정보를 쿼리하는 데 사용된다는 것입니다. 여기서 유형 안전은 실론 메타 프로그래밍을위한 명시적인 디자인 목표였습니다.

답변

1

a의 정규화되지 않은 이름을 얻으려면 a.declaration.name을 사용해야합니다. (또는 a.declaration.qualifiedName는 정규화 된 이름을 얻을 수 있습니다.) Object.string에 의해 설명 된대로,이 인스턴스를 나타내는 단지

개발자 친화적 인 문자열 이후

a.string 사용하지 마십시오.

키 용도로 사용하지 않습니다.