Arrays 如何拥有作为数组的实例变量
我想用一个类创建一个smalltalk应用程序,该类的实例变量是数组,实例变量是数组的大小。理想情况下,我希望在创建对象时初始化这些,但我在方法中手动初始化了这些 以下是我的代码: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
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.