smalltalk中的信息

smalltalk中的信息,smalltalk,pharo,Smalltalk,Pharo,我是Smalltalk的新手,我有个问题 我写了这封信: ((Objednavkaset select:[:a | a auto porucha notEmpty]) select: [:d | (d auto porucha select:[:x | x datum_poruchy between: x datum_vypujceni and: x datum_skutecneh

我是Smalltalk的新手,我有个问题

我写了这封信:

((Objednavkaset select:[:a | a auto porucha notEmpty])
    select: [:d | 
        (d auto porucha select:[:x | 
            x datum_poruchy
                between: x datum_vypujceni
                and: x datum_skutecneho_vraceni])
            size > 0])
我有这个问题,我需要从这个选择访问datum_vypujceni和datum_skutecneho_vraceni

选择:[:d | d auto porucha选择:[:x | x datum_poruch介于:x datum_vypujceni和:x datum_skutecneho_vraceni之间]]

但我不知道怎么做,有没有办法访问它

这是一张图表,如果你需要的话


你的目标是什么?如果要获取所有至少有一个poruch的Objednavka,并且该poruch的日期介于它所属的Objednavka的其他日期之间,则可以这样做:

(Objednavkaset select: [ :objed |
    objed auto porucha anySatisfy: [ :poruchy | 
            poruchy datum_poruchy
                between: objed datum_vypujceni
                and: objed datum_skutecneho_vraceni ] ] ]

我也不知道你的闲聊是否有什么好处。如果没有,请告诉我。如果你输入代码,它肯定有

,正如我喜欢Uko关于删除初始select:和使用ANYSUPPITE:的答案一样,我认为Jarda的问题仍然没有答案

实际问题是如何访问objed的两个实例变量datum_vypujceni和datum_skutecneho_vraceni,而不是如何编写选择脚本

下面是这个简单问题的答案:Jarda,在Objednavka类中添加两个方法来回答这些实例变量:

datum_vypujceni
    ^datum_vypujceni

datum_skutecneho_vraceni
    ^datum_skutecneho_vraceni
一旦有了这些方法,脚本将从objed变量中获取这些数据。还要注意,您需要另一个getter来访问poruchy的数据。因此,请确保您的Poruchy类具有getter方法

datum_poruchy
    ^datum_poruchy

在您的方法中,您使用auto porucha和d auto porucha。这条长长的链条表明,某些行为可能没有在正确的对象上定义。德米特定律建议减少这些链条,例如,通过在对象上定义此自动指的是porucha Anyder满足的内容:。。。实际上是

因为最里面的条件是

x datum_poruchy
       between: x datum_vypujceni
       and: x datum_skutecneho_vraceni
一切都是x对象的一部分,所以整个条件都应该存在,比如

hasValidPoruchy
    ^datum_poruchy
           between: datum_vypujceni
           and: datum_skutecneho_vraceni

我会编辑你澄清你真正想要什么,但我可以提供这么多到目前为止

我认为你的第一级选择:让你更难看清事物。使用anysuccess:将自动过滤掉空的

Objednavkaset select: [:eachSet | 
    eachSet auto porucha anySatisfy:[:eachPorucha | 
        eachPorucha datum_poruchy
            between: x datum_vypujceni
            and: x datum_skutecneho_vraceni]]

如果你想用英语而不是斯拉夫语来调用你的类和方法,我不知道它是什么,但我可以读一下,更多的人会理解你想做什么。请在你的问题上标记你正在使用的Smalltalk,例如Pharo,Squeak,那么,在您选择/筛选后,您想收集/映射出两个基准的变量吗?是这样吗?@Uko:我同意,翻译会很好。使用使用英语库和关键字的语言与非英语使用者编程后,我们总是发现用英语保存代码更容易。我还强烈建议您遵循Smalltalk约定,对方法名使用lowerCamelCase,而不是下划线分隔的命名,并且使用有意义的变量名,而不是a、d和x。Smalltalk的全部目的是让它读起来像一个非程序员几乎可以理解的英语句子。你注意到datum_vypujceni和datum_skutecneho_vraceni与datum_Poruchi?Uko不是同一类人吗,我想他们是。在问题示例中,最里面的select块将三条DATAM_uuu消息发送到x。