我正在阅读“D编程语言”一书。它讲的是内部阶级。
class Outer{
int x;
this(){
x = 99;
new Inner;
}
class Inner{
int x;
this(){
x = 5;
writeln( "Inner x = ", x, "; Outer x = ", this.outer.x );
}
}
}
正如书中所说,为了能够访问类的外部x,我需要使用this.outer.x。但令人困惑的是,“外”类的名称变成小写“外”。使用正常的类名“Outer”,编译器会给出错误消息。它就像编译器决定你需要使用什么作为名称并强制使用它生成的名称。
我的问题是,当我将“Outer”类重命名为“bLaH”时,现在我再也无法进行外部课程了。
class bLaH{
int x;
this(){
x = 99;
new Inner;
}
class Inner{
int x;
this(){
x = 5;
writeln( "Inner x = ", x, "; Outer x = ", this.bLaH.x );
}
}
}
访问外部类时使用的名称并不明显。第一个字母现在是小写,但编译器说“test1.bLaH”没有定义。 (文件名是test1.d)
如果我将“this.bLaH”转换为“this.blah”,可能会认为编译器可能会将外部类的名称转换为全部小写,这次,编译器会说“未定义变量'blah'”。
关于此语言是否存在设计错误?作为程序员,我不喜欢编译器完成这种类型的名称转换。
我在Windows XP上,DMD版本是2.060。
答案 0 :(得分:12)
outer
是一个关键字。这就像super
或其他什么。类始终只嵌套在一个类中,因此outer
关键字引用该类。
http://dlang.org/class.html#nested
在这里你可以发现outer
实际上是一个属性。