如何解决Smalltalk:有没有像“在”或“被包含”之类的东西?
我在使用 Smalltalk 时遇到了麻烦。是否有“在”或“包含/包含”之类的运算符?
我有类 Student 和 Exam(带有属性 student)以及集合 StudentsList 和 ExamsList。在 ExamsList 中,我想显示符合条件的 Class Exam 的所有实例(对象设置为属性 student 的值)包含在集合 StudentsList 中。
类似于下面的代码,但它不起作用:
ExamsList list: (Exam allInstances select: [ :ex | (StudentsList includes: ex student) ]).
你能想到一些优雅的解决方案吗?
非常感谢!
解决方法
即使您的问题缺乏一些信息,也有一些评论可能会有所帮助。
-
如果您的命名约定一致并且
ExamsList
是一个类,那么StudentsList
也必须是一个类。在这种情况下,您的代码不起作用,因为类不理解消息#includes:
,该消息旨在发送到Collection
的子实例。 -
假设我的猜测是适用的,我会指出为每个对象集合都有一个类并不是一个好主意。因此,您应该向类
ExamsList
添加一个类变量Exams
,而不是类Exam
,初始化为Set
并将 {{1} 的每个实例存储在那里}} 您希望保留以供将来查询使用。 -
同样的,你应该给类
Exam
添加一个类变量Students
,去掉Student
。 -
通过这种设计,每个重要的新实例都应该保存在类持有的相应集合中(有关如何执行此操作的提示,请参见下面的 6)。这将消除枚举
StudentsList
的需要。 -
在任何情况下,您都应该了解
#allInstances
是一条系统消息,即它不用于查询模型领域中的对象,因为它属于低得多的抽象级别。请注意,#allInstances
将收集出于任何原因(测试、示例、打开的调试器或检查器等)可能仍然存在而不属于您的模型的实例。 -
如果每个
#allInstances
都有一个Exam
,您可以在将Student
分配给指定的Exam
时将其存储在Exams
集合中,一些关于
Student
( Exam >> forStudent: aStudent
Exams add: self.
student := aStudent
是 student
的 ivar,Exam
代表有具体问题的实例)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。