创建构造函数,添加Io语言中的属性和方法



我在练习Io语言。寻找来源是如此困难。正如你所知,在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"。语法很简单,但我想我仍然没有弄清楚语言的结构。有什么想法,类似的来源,或者有人可以解释吗?

要回答您的问题,您需要尝试:call argAt(1) doInContext(cos),其中传递到该方法的第二个参数是do()包装器。

现在,忽略这一点,让我来解决这里的真正问题。类和对象是一回事。唯一的区别是,编译器通常会限制对类的处理,并限制对实例的处理。Io并没有这么做,它说你可以把一切都当作一个物体,并随心所欲地使用它。因此,考虑到这一点,考虑Io如何处理继承。像Ruby这样的语言并不是这样的,它们将某些方法注入到新对象中,这样它们就可以独立运行。Io使用一种称为"差分继承"的继承方法。2004年对我的解释大致是这样的:

"想想大象吧。每个人都知道大象又大又灰,有四条腿、耳朵和一个鼻子。所以,如果有人问你小飞象长什么样,你可能会说,‘小飞象是一头矮大象,耳朵大而松软,戴着弓,会飞。’你不必告诉他们大象是由什么组成的来形容小飞象,我们知道这一点,因为我们知道小飞象就是一头大象,也是小飞象自己的贡品胜过大象的

这意味着,对于静态变量,您可以简单地将其视为普通的"实例变量",并且在任何实例中都不向其写入。如果您这样做,它将保留被覆盖的值。Io中没有私有作用域,但如果你绝对需要私有的东西,你可以用外部存储来伪造它。Io更倾向于编程语言的"如果你知道自己在做什么,就可以随意开枪"。

最新更新