类型安全的元编程吗?使用字符串查询ceylon.用于元信息的语言



似乎在type.getAttributes()的返回值和type.getAttribute()的参数值之间存在不匹配,这涉及到属性的(限定的还是非限定的)命名:

如果getAttributes返回的属性名称为:"ceylon.language:字符串。这不能用于压缩两个模型的属性:

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 "。由getAttributes()返回。

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

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

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

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

它可能需要一个基于树的元信息集合、一个只检索所需信息的选择函数和一个比较函数。最后,它将有点像LINQ for ceylon的元信息。

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

我真的不明白的是字符串是用来查询锡兰。用于元信息的语言,其中类型安全是锡兰元编程的明确设计目标。

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

不要使用a.string,因为,根据Object.string的文档,它只是

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

不能用作键

最新更新