首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类型安全的元编程?使用字符串查询ceylon.language以获取元信息?

类型安全的元编程?使用字符串查询ceylon.language以获取元信息?
EN

Stack Overflow用户
提问于 2016-10-08 13:17:24
回答 1查看 117关注 0票数 0

type.getAttributes()的返回值与type.getAttribute()的参数值之间似乎不匹配,这与属性的(量化与非限定)命名有关:

如果getAttributes返回的属性的名称是"ceylon.language::String.reversed“,则不能用于压缩两个模型的属性:

代码语言:javascript
复制
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中的元信息,其中类型安全是锡兰元编程的一个明确的设计目标。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-08 21:38:51

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

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

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

它不是用来做钥匙的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39932833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档