2009-03-12 9 views
1
私は "Foo"のようなものの出力を期待していましたが、代わりにgstは "nil"を出力します。これはちょっと奇妙に見えますか?

答えて

2

Object subclass: Foo []「通常の」Smalltalkの構文ではありませんが、最近追加されたファイルでコード化することができます。その前に、クラスを宣言するための専用の構文はありませんでした。なぜなら、それらは画像のコマンドによって作成されるからです。あなたはカップルの理由のために間違っているだろうと予想通り、このコードを解釈:subclass:Objectに送信された実際のメッセージだった場合、それだけで宣言されているので

  • 最初に、そしてFooは可能ではない何か、を解決する必要があります。しかし、舞台裏では、コンパイラは同様のことを行いますObject subclass: #Fooここで、#Fooは作成する新しいクラスの名前のシンボルです。そのようなすべてのコードを記述することは可能です。ただし、クラス名を直接使用することはできません(コードが読み取られた時点ではまだ存在しないため)。あなたはどこにでも(Smalltalk at: #Foo) new printNlをしなければならないでしょう。だから、フォーム全体Object subclass: Foo [ ]は、などだけでこのクラスを作成する必要があることを宣言し、この時点でメッセージがObjectに送信されなければならないという意味ではない純粋な構文、

  • 第二に、あなたがクラスを作成する必要はありませんアルゴリズムの途中ですぐにメッセージを送信すると、それは開発の実践としてはかなり醜いでしょう。ブラウザがそれらを表示できるように、クラスをシステムに登録する必要があります。コンパイラは依存関係を自動的に再コンパイルすることができます。バージョンコントロールはそれらを記録できます。また、コードが誤ってこの2回実行するとどうなりますか?あなたはセカンドクラスのFooを取得し、以前のものを忘れていますか?したがって、通常、コンパイラ、ブラウザ、およびその他のメタプログラミングツールのみが、新しいクラスを作成し、プログラマの要求時にのみ作成されます。

+0

その場でサブクラスを作成すると、java>でうまく動作します。 – milan

2

これは2つのステートメントとして解釈されます。最初は

オブジェクトのサブクラスである:はFoo []

と第二は、それがゼロであるように、新しい変数が未定義

printNl新しい

あります。

関連する問題