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