首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Powerset - smalltalk

Powerset - smalltalk
EN

Stack Overflow用户
提问于 2013-09-04 18:36:58
回答 2查看 224关注 0票数 1

请解释为什么以下代码是错误的:

代码语言:javascript
复制
powerset
     |ps|
     ps := Set with: (Set new).
     self do: [:item | ps addToPowerSet: item].
    ^ps

addToPowerSet: elt
    | first second third var |
    first := self copy.  
    second := self copy.  
    third := Set new.
    second do:  [:item | var := item copy. var add: elt. third add: var.].
    ^ first addAll: third

这两种方法都在Set类中实现。我尝试过调试它,我认为错误就在这里:

代码语言:javascript
复制
second do:  [:item | var := item copy. var add: elt. third add: var.].

但我不知道到底是什么。

好的,addToPowerSet方法的示例:

让我们假设powerset变量ps是相等的:

代码语言:javascript
复制
{{empty}, {a}, {b}, {a,b}}

item = c. addToPowerSet方法应该返回:

代码语言:javascript
复制
{
    {empty}, {a}, {b}, {a,b},
    {c}, {a, c}, {b, c}, {a,b,c}
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-13 14:45:16

不太熟悉堆栈溢出中的格式设置,但是每次调用addToPowerSet:时返回一个新集的问题不是吗?这似乎是可行的:

代码语言:javascript
复制
    addToPowerSet: elt
| second third var |
second := self copy.
third := Set new.
second do: 
        [:item |
        var := item copy.
        var add: elt.
        third add: var].
^self addAll: third
票数 3
EN

Stack Overflow用户

发布于 2013-09-04 19:53:08

首先,你的设计有两个问题,你想要的是错误的。

  1. 要使c addToPowerSet在任何对象上工作,就必须将其添加到Object中。
  2. 表达式c addToPowerSet不引用powerset。

您应该做的是创建一个Set的子类,它覆盖add:方法,或者在Set上添加一个方法addToPowerset:,它应该处理接收方不是powerset的情况。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18621364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档