工作区没有为我返回正确的值

Pab*_*ico 3 smalltalk

我有一些代码的问题。

如果我写, Recenzes 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].
Run Code Online (Sandbox Code Playgroud)

我可以使用 ^ 命令获得“Hitachi P21”。但是如果我在这里使用变量“brzdy”:Recenzes select: [:a | a komponenta nazev = brzdy]我什么也得不到。

简而言之。我想显示“Komponenty”的“Recenzes”,它们位于“Sekces”中,值为“Brzdy”,它们保存在“Recenzes”和“Sekces”的“Komponenty”(集)列中。

有谁知道为什么?

Lea*_*lia 5

由于brzdy#collect:消息的结果,因此它是字符串的集合,而不是单个字符串。因此没有元素a会满足条件a komponenta nazev = brzdy,因为您将比较不同类的对象。尝试一些关于

Recenzes select: [:a | brzdy includes: a komponenta nazev]
Run Code Online (Sandbox Code Playgroud)

作为一个侧面说明,请记住,您可以通过使用消除一些括号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]
Run Code Online (Sandbox Code Playgroud)

(我对这个#flatten消息不熟悉,所以我不知道这是必要的还是多余的)。

  • 哦,谢谢你!有用。我使用 #flatten 从 Set 创建记录。 (2认同)