2017-01-30 32 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)您传递给该方法的第二个参数是一个do()包装。

现在,忽略这一点,让我解决真正的问题。类和对象是一回事。唯一的区别是,通常编译器会限制您可以对类执行的操作,并限制您可以对实例执行的操作。 Io并没有这样做,它说你可以把所有东西当作一个物体来使用,不管你想要什么。因此,考虑到这一点,请考虑Io如何处理继承。这不是像Ruby那样的语言,它们将某些方法注入到新对象中,以便它们可以独立运行。 Io使用称为“差异继承”的继承方法。我在2004年向我解释的方式大致是这样的:

“想象大象,每个人都知道一头大象,灰色的,有4条腿,耳朵和一个躯干,所以如果有人问道你可能会说Dumbo看起来像什么,'Dumbo是个矮小的大象,耳朵很大,戴着蝴蝶结,可以飞翔。'你不必告诉他们一切都象是由描述小飞象,我们知道,因为我们知道小飞象是一个大象和小飞象自己的属性覆盖大象有什么”

这意味着,你的静态变量你可以简单地把它看作一个普通的“实例变量”,并且不要在任何情况下写入它。如果你这样做,它会保持这个被覆盖的价值。 Io中没有私人范围,但如果你绝对需要私密的东西,你可以用外部存储来伪造它。 Io更倾向于“如果你知道自己在做什么,随时在编程语言的脚下自我拍摄”。

+0

我知道这个例子很好理解语言结构。我会做更多的读物。我非常喜欢IO,但不幸的是,没有那么多资源。 –

+0

好吧,我创建了withConstructor部分。我如何添加实例属性?有小费吗? –

+0

就是这样,“实例”和“类/静态”属性之间没有区别。唯一的区别是你如何使用它们。您可以直接将'allFoodItemsEaten'添加到'Animal',如果您想设置或更新,请告诉Animal更新它,而不是自我。 – jer

相关问题