是否可以将 [ 和 ] 省略为消息,例如 at:ifAbsent: 如果您不需要完整的块?



在smalltalk中(特别是pharo/squeak),我想知道是否可以忽略" [和"],以示为:infoabsent:ifabsent:if infor:ifabsent:如果您不需要这样的块;

^ bookTitles at: bookID ifAbsent: ''.

^ books at: bookID ifAbsent: nil.

代码之所以起作用,是因为(在Pharo/Squeak中)对象>>值只是返回自我。但是我想知道这种用途的接受程度是如何接受的,或者您是否应该始终键入[和]即使您不在乎该参数是快速评估还是不止一次评估。

签名:

at: key ifAbsent: aBlock 

声明将块用作第二参数的意图...但是SmallTalk并不是一种强烈打字的语言,因此,您可以在那里传递哪种对象?任何理解消息#value的种类,因此,请注意#value在每种情况下的每个特定含义,但要占据多态性的优势!

并非所有的smalltalk方言都可以在对象上实现#value,因此如果您将不了解#value的对象交给其他Smalltalk方言,则代码可能不会在其他SmallTalk方言上运行。<<<<<<<<<<<<<</p>

只要您知道#value做什么是您期望的,可以通过任何种类的对象,

您的代码对于来自其他SmallTalk方言或Smalltallk的新手来说可能很奇怪,因为他们了解到您在这里传递的内容是一个块,但是发送#Join之类的消息也是如此:到诸如字符串的集合。..

最后,我会说不用担心可移植性是否不是您的主要问题。

这就是法罗的代码批评家所说的类似情况:

特殊消息中的非块:

检查未在特殊消息中使用块的方法。 SmallTalk的新人可能会编写:" Aboolean Iftrue:: (自dosomething)"而不是正确的版本:" aboolean iftrue: [self dosomething]"。 编译器无法优化它们。

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

更新:

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

我会说,将它们排除在外不是一个好主意。如果您遗漏了帕伦斯,则将热切地评估该论点,并将发送#Value。因此,如果" Slef dosomething"具有副作用,那将是不好的。如果#Value做您不期望的事情,也可能会很糟糕,例如也许是人为的

booktitles at:bookid ifabsent:'丢失标题' ->'isbn -000000'

如果您的代码有效,并且您是唯一查看源的人,则可以。如果其他人要查看来源,那么我想说一个空块[]将更可读。但是总的来说,如果您真的很关心错误,那一个好主意不在标准做法之外冒险,因为没有办法保证您不会有任何问题。

相关内容

最新更新