锡兰的运行时元编程
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`.... 作为一个函数?
`Example`.getAttributes()
returns 一个空列表,因为 getAttributes
采用三个类型参数:Container
、Get
、Set
.当作为 getAttributes()
调用时,类型检查器会尝试推断它们,但由于没有信息(没有具有适当类型的参数),推断的类型参数是 Nothing
。由于 Nothing
不是任何 class 成员的容器,因此结果列表为空。使用 getAttributes<>()
代替使用默认类型参数,或明确指定它们(例如 getAttributes<Example>()
)。与 getMethods()
相同。 Try online
type
函数在ceylon.language.meta
中,需要导入:import ceylon.language.meta { type }
。一旦你这样做(并删除 e.type()
行),编译错误就会消失。
如果直接想要函数的元对象,可以这样写`Example.a`
.
我使用 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`.... 作为一个函数?
`Example`.getAttributes()
returns 一个空列表,因为getAttributes
采用三个类型参数:Container
、Get
、Set
.当作为getAttributes()
调用时,类型检查器会尝试推断它们,但由于没有信息(没有具有适当类型的参数),推断的类型参数是Nothing
。由于Nothing
不是任何 class 成员的容器,因此结果列表为空。使用getAttributes<>()
代替使用默认类型参数,或明确指定它们(例如getAttributes<Example>()
)。与getMethods()
相同。 Try onlinetype
函数在ceylon.language.meta
中,需要导入:import ceylon.language.meta { type }
。一旦你这样做(并删除e.type()
行),编译错误就会消失。如果直接想要函数的元对象,可以这样写
`Example.a`
.