#metaprogramming #ceylon
#метапрограммирование #цейлон
Вопрос:
Похоже, существует несоответствие между возвращаемым значением type.GetAttributes() и значением аргумента type.getAttribute() в отношении (qulified или unqualified) именования атрибутов:
Если имя атрибута, возвращаемого GetAttributes, например, «ceylon.language::String.reversed» это нельзя использовать для сопоставления атрибутов двух моделей:
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() ожидает, например, «reversed» в качестве строки аргумента вместо «ceylon .language::String.reversed», который возвращается GetAttributes() .
В общем, я не одобряю этот подход к использованию строк для такой задачи. Но, похоже, это единственный способ получить напрямую один единственный атрибут, запросив его с помощью строки.
Единственное альтернативное решение, которое я вижу, — это прочитать все атрибуты, например, в TreeSet, написать компаратор, который сравнивает представление атрибутов моделей вместо их строкового представления, и поэтому давайте извлекать требуемые атрибуты в правильном порядке для их архивирования. Или что-то вроде: zip(… GetAttributes<…>(…).sort(), … GetAttributes<…>(…).sort())?
Иногда это может быть неэффективным, поскольку требует обработки всех атрибутов, когда иногда не все атрибуты необходимы.
Было бы желательно иметь стандартный api для предоставления метаинформации способом, аналогичным api коллекций, для таких задач, как рекурсивное применение функции сравнения к иерархиям объектов для сопоставления или проверки на различные типы равенства (по точному совпадению типов, по подтипу, по значению, унификации, …)
Может потребоваться сбор метаинформации на основе дерева, функция выбора для извлечения только требуемой информации и функция сравнения. В итоге это будет своего рода LINQ для метаинформации ceylon.
Мне интересно, существует ли такой API уже, или он запланирован, или пользователю остается создать собственную пользовательскую реализацию?
Чего я действительно не понимаю, так это того, что строки используются для запроса ceylon.язык для метаинформации, где безопасность типов была явной целью проектирования для цейлонского метапрограммирования.
Ответ №1:
Вы должны использовать a.declaration.name
, чтобы получить неквалифицированное имя атрибута a
. (Или a.declaration.qualifiedName
для получения полного имени.)
Не используйте a.string
, поскольку, как задокументировано Object.string
, это просто
Удобная для разработчика строка, представляющая экземпляр.
Он не предназначен для использования в качестве ключа.