3

我现在正在阅读“The D Programming Language”一书。它讲述了内部类。

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 );
        }
    }
}

正如书中所说,为了能够访问类 Outer 的 x,我需要使用 this.outer.x。但是一件令人困惑的事情是“Outer”类的名称变成了小写的“outer”。使用普通的类名“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。

4

1 回答 1

12

outer是一个关键字。这就像super什么。一个类总是嵌套在一个类中,所以outer关键字指的是那个类。

http://dlang.org/class.html#nested

在这里你可以发现它outer实际上是一个属性。

于 2013-01-04T09:27:01.643 回答