1

我正在练习Io语言。找货源太难了。如您所知,Io 语言没有类。但是我们可以根据需要创建我们的类。无论如何,假设我希望能够运行它并创建一个 Animal 类。

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”。语法很简单,但我想我仍然没有弄清楚语言的结构。任何想法,类似来源或可以解释的人?

4

1 回答 1

3

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

现在,忽略这一点,让我在这里解决真正的问题。类和对象是一回事。唯一的区别是,通常编译器会限制您可以对类执行的操作,并限制您可以对实例执行的操作。Io 没有这样做,它说您可以将所有内容视为对象并根据需要使用它。因此,考虑到这一点,考虑 Io 如何处理继承。这不是像 Ruby 这样的语言,它们将某些方法注入新对象,以便它们可以独立运行。Io 使用一种称为“差分继承”的继承方法。2004 年向我解释的方式大致是这样的:

“从大象的角度来想。每个人都知道大象很大,灰色,有 4 条腿、耳朵和一个躯干。所以如果有人问你小飞象长什么样,你可能会说,‘小飞象是一头短的大象,大耳朵松软,戴着弓,可以飞。你不必告诉他们大象是由什么构成来描述小飞象的,我们知道,因为我们知道小飞象是一头大象,而小飞象自己的属性会超越大象的属性。”

这意味着,您的静态变量可以简单地将其视为普通的“实例变量”,并且在任何情况下都不要写入它。如果这样做,它将保留该覆盖的值。Io 中没有私有范围之类的东西,但是如果您绝对需要私有内容,您可以使用外部存储在某种程度上伪造它。Io 更多地属于编程语言的“如果你知道自己在做什么,请随意拍自己的脚”。

于 2017-01-30T17:25:15.910 回答