Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何拥有作为数组的实例变量_Arrays_Smalltalk_Gnu Smalltalk - Fatal编程技术网

Arrays 如何拥有作为数组的实例变量

Arrays 如何拥有作为数组的实例变量,arrays,smalltalk,gnu-smalltalk,Arrays,Smalltalk,Gnu Smalltalk,我想用一个类创建一个smalltalk应用程序,该类的实例变量是数组,实例变量是数组的大小。理想情况下,我希望在创建对象时初始化这些,但我在方法中手动初始化了这些 以下是我的代码: Object subclass: Student [ | numTests marks | initialize [ numTests := 0. marks := Array new: 10. ] ] student := Student new. stu

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

以下是我的代码:

Object subclass: Student [
    | numTests marks |


    initialize [
        numTests := 0.
        marks := Array new: 10.
    ]
]
student := Student new.
student initialize.
但我得到了以下错误:

Object: Array new: 10 "<0x10b054b80>" error: method is responsibility of a subclass
Object:Array new:10“”错误:方法由子类负责

如何解决此问题?

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

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


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

我愿意使用不同于数组的数据结构。如果您能更新您的答案,以包含我如何使用集合以及如何向集合添加/删除元素的示例代码,我将不胜感激。当然,所有这些都是类中的实例变量。根据您的请求进行更新非常感谢。最后一个问题,我接受它作为答案。如果它的大小是动态的,那么将其初始化为10的目的是什么?对于许多类来说,当您确切地知道或甚至粗略地知道一个集合将包含多少元素时,发送#new:(如new:10)是可选的优化。我只是在这种情况下使用它来最小化我对您的示例所做的更改。一般来说,除非你有一个非常大的集合(数千个或更多的元素),否则我会坚持使用Orderedcollection new而不是Orderedcollection new:10。好的,我也会根据需要这样做。非常感谢你。
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.