微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Smalltalk:有没有像“在”或“被包含”之类的东西?

如何解决Smalltalk:有没有像“在”或“被包含”之类的东西?

我在使用 Smalltalk 时遇到了麻烦。是否有“在”或“包含/包含”之类的运算符?

我有类 Student 和 Exam(带有属性 student)以及集合 StudentsList 和 ExamsList。在 ExamsList 中,我想显示符合条件的 Class Exam 的所有实例(对象设置为属性 student 的值)包含在集合 StudentsList 中。

类似于下面的代码,但它不起作用:

ExamsList list: (Exam allInstances select: [ :ex | (StudentsList includes: ex student) ]).

你能想到一些优雅的解决方案吗?

非常感谢!

解决方法

即使您的问题缺乏一些信息,也有一些评论可能会有所帮助。

  1. 如果您的命名约定一致并且 ExamsList 是一个类,那么 StudentsList 也必须是一个类。在这种情况下,您的代码不起作用,因为类不理解消息 #includes:,该消息旨在发送到 Collection 的子实例。

  2. 假设我的猜测是适用的,我会指出为每个对象集合都有一个类并不是一个好主意。因此,您应该向类 ExamsList 添加一个类变量 Exams,而不是类 Exam,初始化为 Set 并将 {{1} 的每个实例存储在那里}} 您希望保留以供将来查询使用。

  3. 同样的,你应该给类Exam添加一个类变量Students,去掉Student

  4. 通过这种设计,每个重要的新实例都应该保存在类持有的相应集合中(有关如何执行此操作的提示,请参见下面的 6)。这将消除枚举 StudentsList 的需要。

  5. 在任何情况下,您都应该了解 #allInstances 是一条系统消息,即它不用于查询模型领域中的对象,因为它属于低得多的抽象级别。请注意,#allInstances 将收集出于任何原因(测试、示例、打开的调试器或检查器等)可能仍然存在而不属于您的模型的实例。

  6. 如果每个 #allInstances 都有一个 Exam,您可以在将 Student 分配给指定的 Exam 时将其存储在 Exams 集合中,一些关于

Student

Exam >> forStudent: aStudent Exams add: self. student := aStudent student 的 ivar,Exam 代表有具体问题的实例)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。