如何使用作为数组的实例变量

Kea*_*sed 2 arrays smalltalk gnu-smalltalk

我想创建一个smalltalk应用程序,其中一个类具有一个实例变量,该实例变量是一个数组,一个实例变量是数组的大小.理想情况下,我希望在创建对象时初始化这些对象,但我会在方法中手动初始化这些对象.

以下是我的代码:

Object subclass: Student [
    | numTests marks |


    initialize [
        numTests := 0.
        marks := Array new: 10.
    ]
]
student := Student new.
student initialize.
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误:

Object: Array new: 10 "<0x10b054b80>" error: method is responsibility of a subclass
Run Code Online (Sandbox Code Playgroud)

我怎么解决这个问题?

bli*_*ihp 6

你可能真的不想这样做.我通常使用Squeak衍生物和Array new:有效,但通常不是你想要的,因为数组是固定大小的(即你不能添加或删除元素),所以你通常使用类似OrderedCollection的东西.此外,您通常不希望将大小存储在ivar中,而是在需要知道它包含多少元素时将#size发送到您的集合.

我已根据上述建议修改了您的代码示例(另请注意,您不需要显式发送#initialize,它是通过#new :)为您完成的:

Object subclass: Student [
    | marks |


    initialize [
        marks := OrderedCollection new: 10.
    ].

    addMark: newMark [
        marks add: newMark
    ].

    removeMarkAt: markIdx [
        marks removeAt: markIdx
    ].

    size [
        ^ marks size
    ]
]
student := Student new.
Run Code Online (Sandbox Code Playgroud)

如果您确实需要创建固定大小的数组,请更新您正在使用的Smalltalk变体的问题,以便具有特定实施知识的人可以提供帮助.您似乎遇到的问题是您的Smalltalk实现将Array视为抽象类,因此您需要实例化其子类以获取固定大小的数组.