Smalltalk 如果您没有';你不需要整个街区吗?

Smalltalk 如果您没有';你不需要整个街区吗?,smalltalk,pharo,squeak,visualworks,gemstone,Smalltalk,Pharo,Squeak,Visualworks,Gemstone,在Smalltalk(特别是Pharo/Squeak)中,我想知道在消息的参数中省略“[”和“]”是否可以,比如:ifAbsent:if您不需要块,像这样 ^ bookTitles at: bookID ifAbsent: ''. 及 代码之所以有效,是因为(在Pharo/Squeak中)Object>>值只返回self。但我想知道这种用法是如何被接受的,或者你是否应该始终键入[and],即使你不在乎参数是快速计算还是多次计算。这就是法罗的代码评论家对类似情况的看法: 特殊消息中的非块: 检查

在Smalltalk(特别是Pharo/Squeak)中,我想知道在消息的参数中省略“[”和“]”是否可以,比如:ifAbsent:if您不需要块,像这样

^ bookTitles at: bookID ifAbsent: ''.


代码之所以有效,是因为(在Pharo/Squeak中)Object>>值只返回self。但我想知道这种用法是如何被接受的,或者你是否应该始终键入[and],即使你不在乎参数是快速计算还是多次计算。

这就是法罗的代码评论家对类似情况的看法:

特殊消息中的非块:

检查在特殊消息中不使用块的方法。 不熟悉Smalltalk的人可能会编写这样的代码:“aBoolean ifTrue: (自我剂量测定法)而不是正确的版本:“aBoolean ifTrue: [自我剂量测定]”。即使这些代码可能是正确的, 编译器无法对它们进行优化

这个规则可以在优化中找到,所以您可能会忽略它,但我认为使用块还是更好的

更新:


at:ifAbsent:
不由此规则触发。而且它不是由编译器优化的。因此,在这种情况下,优化不是使用块的理由。

我想说,不使用块不是一个好主意。如果你忽略了参数,参数将被急切地评估,并将被发送#值。所以如果“slefdosomething”有副作用,那就糟糕了。如果#value做了一些你意想不到的事情,例如,可能是人为的,这也可能是不好的


bookTitles at:bookID ifAbsent:'Missing title'->'ISBN-000000'

如果您的代码有效,并且您是唯一查看源代码的人,那么就可以了。如果其他人要查看源代码,那么我会说空块[]会更可读。但总的来说,如果你真的关心bug,最好不要在标准实践之外冒险,因为没有办法保证你不会有任何问题

并非所有的Smalltalk方言都能在开箱即用的对象上实现#value,因此,如果您提交的对象不理解#value,那么您的代码可能无法在其他Smalltalk方言上运行

传递任何类型的对象都是可以的,只要您知道#value所做的就是您所期望的

对于来自其他smalltalk方言或是Smalltallk新手的人来说,您的代码可能看起来很奇怪,因为他们知道您在这里传递的是一个块,但发送类似#join:到字符串集合的消息也是如此

最后,我想说,如果便携性不是您的主要问题,请不要担心。

签名:

at: key ifAbsent: aBlock 
声明将块用作第二个参数的意图。。。
但是Smalltalk不是一种强类型语言,那么,您可以传递什么类型的对象呢?任何理解信息#值的类型,因此,在每种情况下都要小心#值的每个特定含义,但要利用多态性

但是编译器没有处理at:ifAbsent:特别是像ifTrue:那样,以这种方式使用at:ifAbsent:不会引发批评。嗯,我只是尝试了一些方法,没有发现在执行时间上有什么大的差异。我很好奇是否还有其他答案。有趣的问题..对我来说,Pharo中CodeCritics的评论对于没有编译器优化的方法是错误的。对于ifTrue:或ifNil:,该工具是正确的,但对于许多“通常”接受块,然后简单地向其发送#值的方法,该工具并不正确。但这是我的错误<此规则不会触发代码>在:ifAbsent:处。我只是(错误地)假设,情况也会类似。我更新了答案。
at: key ifAbsent: aBlock