2017-01-30 4 views
1

Ioの言語で練習していました。ソースを見つけることはとても難しいです。あなたが知っているように、Io言語にはクラスはありません。しかし、私たちは必要なものを持ってクラスを作ることができます。とにかく、これを実行してAnimalクラスを作成できるようにしたいとしましょう。コンストラクタの作成、Io言語での属性とメソッドの追加

Animal := Class new("Animal", 
    withConstructor(nameParam, 
     name = nameParam 
    ) 
    withInstanceAttribute("name", "") 
    withInstanceAttribute("foodItemsEaten", 0) 
    withStaticAttribute("allFoodItemsEaten", 0) 
    withMethod("feed", howMuchFood, 
     foodItemsEaten = foodItemsEaten + howMuchFood 
     class allFoodItemsEaten = allFoodItemsEaten + howMuchFood 
     "#{name} has just eaten #{howMuchFood} food items." interpolate println 
    ) 
    withMethod("feedSummary", 
     "So far #{foodItemsEaten} food items eaten by #{name} and #{class allFoodItemsEaten} in total by all dogs." interpolate println 
    ) 
) 

だから私は、このクラス構造を持っている:

Class := Object clone 

Class new := method(name,     // Meta-class constructor 
    cls := Class clone 
    cls __name := name     // Name of the class 
    cls __instanceProto := Object clone // Prototype of instances - hold instance field along with their initial values 
    cls __instanceProto class := cls 

    call argAt(1) doInContext(cls) 
    cls 
) 

私は例えばwithConstructorメソッドを追加しようとしているが、私はさえパラメータを読み取ることができません。

Class withConstructor := method(nameParam 
    self 
) 

私は、コンストラクタでさえそれを処理できませんでした。 「クラスがnameParamに応答しません」と表示されます。構文は簡単ですが、私はまだ言語の構造を理解していないと思います。どんなアイデア、似たような情報源、それを説明できる人?

答えて

2

質問に答えるには、call argAt(1) doInContext(cos)を試してみてください。ここで2番目の引数は、do()ラッパーです。

これを無視して、ここで本当の問題に取り掛かりましょう。クラスとオブジェクトは同じものです。唯一の違いは、通常、コンパイラはクラスでできることを制限し、インスタンスでできることを制限することです。私はそれをしません、それはあなたがオブジェクトとしてすべてを扱うことができると言いますが、あなたが望むのにそれを使用します。したがって、これを念頭に置いて、Ioが継承をどのように処理するかを検討してください。 Rubyのような言語が、新しいオブジェクトに特定のメソッドを注入して、孤立して機能する方法は、そうではありません。 Ioは、 "差分継承"と呼ばれる継承の方法を使用します。

「象の観点から考える誰もが、ゾウは灰色、大規模であることを知っている4足、耳、およびトランクを持っている人が尋ねるので、もし:。。これは2004年に私に説明した方法は、大体このましたあなたはダンボーのように見えますが、ダンボーは短い象で、大きなフロッピーの耳で弓をつけて飛ぶことができます。あなたは彼らに象がダンボを記述するためにで作られているすべてのものを言う必要はありません、我々はダンボは象である知っているので、ダンボ自身の属性は象が、あなたの静的変数を」持っている

これが何を意味するのか上書きすることを知っています単純に通常の "インスタンス変数"のように扱い、どのインスタンスでも書き込まないでください。そうすると、上書きされた値が保持されます。 Ioにはプライベートスコープのようなものはありませんが、プライベートであることが絶対に必要な場合は、外部ストレージでそれをやや偽造することができます。 Ioは、「あなたがしていることを知っているならば、プログラミング言語の足元に自分を撃って自由に感じてください。

+0

私は、この例が言語構造を理解するのに良いことを知っていました。私はそれについてもっと読んでみましょう。私はIOを本当に好きでしたが、あまりにも多くのリソースはありません。 –

+0

さて、私はwithConstructorの部分を作成しました。インスタンス属性を追加するにはどうすればよいですか?任意のヒント? –

+0

それは、インスタンスとクラス/静的属性の区別はありません。唯一の違いは、その使い方です。 'allFoodItemsEaten'を' Animal'に直接追加し、それを設定したり更新したりするには、Animalに、自己ではなく更新するように指示します。 – jer

関連する問題