0

type.getAttributes() 的返回值和 type.getAttribute() 的参数值之间似乎存在关于属性(合格与不合格)命名的不匹配:

如果 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”作为参数字符串,而不是 getAttributes() 返回的“ceylon.language::String.reversed”。

一般来说,我不赞成这种将字符串用于此类任务的方法。但它似乎是通过使用字符串查询来直接检索单个属性的唯一方法。

我看到的唯一替代解决方案是将所有属性读入例如TreeSet,编写一个比较器来比较属性的模型表示而不是它们的字符串表示,因此让我们以正确的顺序检索所需的属性以压缩它们。或者类似:zip(...getAttributes<...>(...).sort(), ...getAttributes<...>(...).sort())?

有时这可能效率不高,因为有时不需要所有属性时它需要处理所有属性。

最好有一个标准api 以类似于集合 api 的方式公开元信息,用于递归地将比较函数应用于对象层次结构以匹配或测试不同类型的相等性(通过精确类型匹配、按子类型, 按价值, 统一性, ...)

它可能需要基于树的元信息集合、仅检索所需信息的选择功能和比较功能。最后,它将是一种用于锡兰元信息的 LINQ。

我想知道这样的 api 是否已经存在,或者是否已计划,或者是否留给用户进行自己的自定义实现?

我真正不明白的是字符串用于查询 ceylon.language 以获取元信息,其中类型安全是 ceylon 元编程的明确设计目标。

4

1 回答 1

1

您应该使用a.declaration.name来获取属性的非限定名称a。(或a.declaration.qualifiedName获取限定名称。)

不要使用a.string, 因为,正如 所记录的Object.string,它只是

表示实例的对开发人员友好的字符串。

它不适合用作钥匙。

于 2016-10-08T21:38:51.400 回答