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()期望“反转”作为参数字符串,而不是getAttributes()返回的"ceylon.language::String.reversed“。
一般来说,我不赞成这种方法来使用字符串来完成这样的任务。但是,它似乎是通过使用字符串查询直接检索单个属性的唯一方法。
我看到的唯一替代解决方案是将所有属性读取到一个TreeSet中,编写一个比较器来比较这些属性的模型表示,而不是它们的字符串表示,因此让我们按照正确的顺序检索所需的属性。或者类似于:zip(...getAttributes<...>(.).sort()、...getAttributes<...>(.).sort())?
有时这可能是无效的,因为它需要处理所有的属性,而有时并不需要所有的属性。
最好有一个标准的 api,以类似于集合api的方式公开元信息,用于递归地将比较函数应用于对象层次结构,以匹配或测试不同类型的等式(按精确类型匹配、按子类型、按值、按值、可统一性)。
它可能需要基于树的元信息集合、仅检索所需信息的选择函数和比较函数。最后,它将是锡兰元信息的LINQ。
我想知道这样的api是否已经存在,或者是计划好的,还是留给用户自己定制实现呢?
我真正不明白的是,字符串用于查询ceylon.language中的元信息,其中类型安全是锡兰元编程的一个明确的设计目标。
发布于 2016-10-08 21:38:51
您应该使用a.declaration.name获取属性a的非限定名。(或a.declaration.qualifiedName获取限定名。)
不要使用a.string,因为,正如Object.string所记录的,它只是
表示实例的对开发人员友好的字符串。
它不是用来做钥匙的。
https://stackoverflow.com/questions/39932833
复制相似问题