在Smalltalk(特别是Pharo / Squeak)中我想知道是否可以省略“[”和“]”作为消息的参数,如:ifAbsent:如果你不需要块,像这样;
^ bookTitles at: bookID ifAbsent: ''.
和
^ books at: bookID ifAbsent: nil.
代码有效,因为(在Pharo / Squeak中)对象>>值只返回self。但是我想知道这种用法是如何被接受的,或者你是否应该总是键入[和],即使你不关心参数是否被快速评估或多次评估。
答案 0 :(得分:3)
签名:
at: key ifAbsent: aBlock
声明使用块作为第二个参数的意图...... 但Smalltalk不是强类型语言,那么,你可以通过什么样的对象?理解#value消息的任何一种,所以,在每种情况下都要注意#value的每个特定含义,但要利用多态性!
答案 1 :(得分:2)
这是Pharo的代码评论家对类似情况所说的话:
特殊消息中的非阻止:
检查特殊消息中不使用块的方法。 Smalltalk的新手可能会编写如下代码:“aBoolean ifTrue: (self doSomething)“而不是正确的版本:”aBoolean ifTrue: [self doSomething]“。即使这些代码片段可能正确, 它们不能被编译器优化。
此规则可以在优化中找到,因此您可能会忽略它,但我认为无论如何使用块都更好。
<强>更新强>
此规则未触发 at:ifAbsent:
。它没有被编译器优化。因此,在这种情况下,优化不是使用块的理由。
答案 2 :(得分:2)
并非所有Smalltalk方言都在开箱即用的对象上实现#value,因此如果您提交了一个不理解#value的对象,您的代码可能无法在其他Smalltalk方言上运行。
只要您知道#value的作用是您所期望的,就可以传递任何类型的对象,
你的代码对于来自其他smalltalk方言的人来说可能看起来很奇怪,或者是Smalltallk的新手,因为他们知道你在这里传递的是一个Block,但是像#join:这样的消息也会发送到一个字符串集合。 ..
最后,我要说如果可移植性不是您的主要问题,请不要担心。
答案 3 :(得分:1)
我想说将它们排除在外并不是一个好主意。如果你遗漏了parens,那么这个论点会被热切地评估,并且会被发送#value。因此,如果“slef doSomething”有副作用,那就太糟糕了。如果#value做了你不期望的事情,那也可能是坏事,例如可能是人为的
bookTitles at:bookID ifAbsent:'Missing title' - &gt; 'ISBN-000000'
答案 4 :(得分:0)
如果您的代码有效并且您是查看源代码的唯一人员,那么可以。如果其他人要查看源代码,那么我会说空块[]会更具可读性。但一般来说,如果你真的关心错误,最好不要冒险超出标准做法,因为没有办法保证你不会有任何问题。