Crystal中Person+非类错误咨询:嵌套类继承self异常解析
关于Crystal中
Person+错误及嵌套类继承self的问题解答 这个问题涉及Crystal编译器处理类定义的内部机制,我来帮你拆解清楚:
1. 什么是Person+?
Person+是Crystal编译器在类定义过程中生成的临时内部类型标记,用来指代还未完成全部定义的类。当编译器正在解析一个类的代码(比如你的Person类),还没完全完成这个类的定义时,它会用这种类名+的格式来标记这个"未完成"的类状态——这是编译器内部用来处理类构建的中间状态,并不是你代码里能直接使用的公开类型。
2. 继承操作为何会出现这种类"被修改"的现象?
这其实不是继承真的修改了Person类,而是Crystal编译器的处理顺序和临时类型机制导致的:
- 当你在
Person内部定义第一个嵌套类Current < self时,此时Person的定义还没完全结束,self指向的是编译器正在构建的Person类,此时编译器会用Person+来标记这个未完成的状态。 - 当你接着定义第二个嵌套类
Destroyed < self时,此时的self已经变成了这个临时的Person+类型,而不是完整的Person类。因为Person+只是编译器内部的临时标识,不是一个可以被继承的完整类,所以就会抛出Person+ is not a class的错误。 - 而当你直接写
< Person时,你明确指定了要继承的是外层的Person类,编译器可以直接定位到正确的类,不会被临时类型干扰;如果只定义一个嵌套类,编译器在处理完这个嵌套类后,会把临时的Person+替换成完整的Person类,所以也不会报错。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

