Smalltalk workspace没有为我返回正确的值

Smalltalk workspace没有为我返回正确的值,smalltalk,Smalltalk,我对一些代码有问题 如果我写recentzes select:[:a | a komponenta nazev='Hitachi P21']我得到了一些正确的记录。但是如果我用这样的东西: | brzdy | brzdy := ((( (Sekces select: [:b | b nazev = 'Brzdy']) collect: [:b | b komponenty]) flatten) select: [:c | c vyrobce nazev = 'Hitachi'

我对一些代码有问题

如果我写recentzes select:[:a | a komponenta nazev='Hitachi P21']我得到了一些正确的记录。但是如果我用这样的东西:

| brzdy |
brzdy := (((
   (Sekces select: [:b | b nazev = 'Brzdy']) collect: [:b | b komponenty]) flatten)
       select: [:c | c vyrobce nazev = 'Hitachi']) collect: [:d | d nazev].
我可以通过^command获取“Hitachi P21”。但是如果我在这里使用变量'brzdy':Recenzes select:[:a | a komponenta nazev=brzdy],我不会得到任何结果

简而言之。我想显示'Komponenty'的'Recenzes',它们位于'Sekces'中,值为'Brzdy',并保存在为'Recenzes'和'Sekces'设置的'Komponenty'列中

有人知道为什么吗?

因为brzdy是collect:message的结果,所以它是字符串的集合,而不是单个字符串。因此,没有元素a会满足条件a komponenta nazev=brzdy,因为您将比较不同类的对象。试着做些类似的事情

Recenzes select: [:a | brzdy includes: a komponenta nazev]
作为旁注,请记住,您可以使用select:thenCollect:而不是select:blah collect:bluh来删除一些括号。比如说

brzdy := (Sekces select: [:b | b nazev = 'Brzdy'] thenCollect: [:b | b komponenty]) flatten
        select: [:c | c vyrobce nazev = 'Hitachi']
        thenCollect: [:d | d nazev]

我不熟悉扁平化消息,因此我无法判断它是必要的还是多余的。

Leandro似乎已经回答了这个问题,但我会注意到一些建议:虽然将所有内容放在一行是完全合法的,但这确实会使调试此类问题变得困难。如果你把它放在一系列单独的行上,那么你可以缩小哪个转换是错误的。可以使用断点单步执行代码,也可以将中间值输出到控制台。另外,你能说说你有哪种方言和版本的Smalltalk吗?无论如何,欢迎来到Smalltalk社区!如果你是这个意思,我用捷克方言。我有Smalltalk 7.4。差不多都在一行。那是我糟糕的格式化。对不起,我不懂方言!Smalltalk是一种语言,有许多不同的实现方式。每个实现都是一种方言,不是一种新的语言,但差异很大,可能不熟悉词汇或习惯用法。所以,Pharo、VisualWorks、Squeak、VA、GemStone、Dolphin、Smalltalk X和其他语言都是各自的方言,就像瑞士德语和德语不同一样。在回答问题时,了解你所说的Smalltalk方言是很有帮助的。我对一些人比其他人更熟悉!哦,谢谢你!它起作用了。我使用“展平”从集合中创建记录。