锡兰的运行时元编程

Runtime meta programming in ceylon

我使用 eclipse ide 从以下代码片段中得到了意想不到的结果:

class Example(String s = "init") {
    shared String a() => "Func 1";
    shared String b = "Attr 1";
    shared String c(Integer i) { return "Func 2"; }
}


shared
void run() {    

  // 1.
  print("getAttributes: " + `Example`.getAttributes().string);
  print("getMethods:    " + `Example`.getMethods().string);
  // prints:   []  
  // i.e. doesnt print any attribute or method

  // 2.
  value e = Example()
  type(e);  // error
  e.type(); // error, should be replaced by the ide with the above version.

}

ad 1.) 结果是:

getAttributes: []
getMethods:    []

我期望包含属性或方法的列表。

ad 2.) 文档说:

"type() 函数将 return 给定实例的封闭类型,它只能是 ClassModel,因为只能实例化 类。 ..."

但我找不到 type() 函数和其他与元编程相关的函数,即我没有得到工具提示,而是得到运行时 (!) 错误:

Exception in thread "main" com.redhat.ceylon.compiler.java.language.UnresolvedCompilationError: method or attribute does not exist: 'type' in type 'Example'

那么,哪里相当于反引号 `Example`.... 作为一个函数?

  1. `Example`.getAttributes() returns 一个空列表,因为 getAttributes 采用三个类型参数:ContainerGetSet.当作为 getAttributes() 调用时,类型检查器会尝试推断它们,但由于没有信息(没有具有适当类型的参数),推断的类型参数是 Nothing。由于 Nothing 不是任何 class 成员的容器,因此结果列表为空。使用 getAttributes<>() 代替使用默认类型参数,或明确指定它们(例如 getAttributes<Example>())。与 getMethods() 相同。 Try online

  2. type函数在ceylon.language.meta中,需要导入:import ceylon.language.meta { type }。一旦你这样做(并删除 e.type() 行),编译错误就会消失。

  3. 如果直接想要函数的元对象,可以这样写`Example.a`.