7

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

^ bookTitles at: bookID ifAbsent: ''.

^ books at: bookID ifAbsent: nil.

该代码有效,因为(在 Pharo/Squeak 中)Object>>value 只返回 self。但是我想知道这种用法的接受程度如何,或者即使您不关心参数是否被快速评估或多次评估,您是否应该始终键入 [ 和 ] 。

4

5 回答 5

3

The signature:

at: key ifAbsent: aBlock 

declares an intention of using a block as a 2nd parameter... But Smalltalk is not a strongly typed language, so, what kind of objects can you pass there? any kind that understand the message #value, so, be careful about each particular meaning of #value in each case, but take advantages of polymorphism!

于 2014-02-05T13:51:44.307 回答
2

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

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

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

最后,我想说如果可移植性对您来说不是主要问题,请不要担心。

于 2014-02-02T12:29:19.190 回答
2

这是 Pharo 的代码评论家对类似情况所说的:

特殊消息中的非阻塞:

检查在特殊消息中不使用块的方法。Smalltalk 的新手可能会编写如下代码:“aBoolean ifTrue: (self doSomething)”而不是正确的版本:“aBoolean ifTrue: [self doSomething]”。即使这些代码段可能是正确的,编译器也无法对其进行优化。

这条规则可以在Optimization中找到,所以你可能会忽略它,但我认为无论如何使用块更好。

更新:

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

于 2014-02-01T12:23:44.213 回答
1

我会说将它们排除在外并不是一个好主意。如果省略括号,参数将被急切地评估,并将发送#value。所以如果“slef doSomething”有副作用,那就不好了。如果#value 做了一些你意想不到的事情,例如可能做作的事情,它也可能很糟糕

bookTitles at: bookID ifAbsent: '缺少标题' -> 'ISBN-000000'

于 2014-02-02T06:40:07.093 回答
0

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

于 2014-02-02T11:19:59.913 回答