评估 Pharo 中的不平等

Evaluate inequality in Pharo

由于我不知道 Pharo smalltalk 中有任何不等式运算符,因此很难检查字符串的不等式。这是我当前的代码:

[ contact password = contact confirmPassword and: firstTime = false and: (contact password = '' ifTrue:[^false])]   whileFalse: [ code]

即这部分:
(contact password = '' ifTrue:[^false])

我做错了什么?有没有更好的方法来检查字符串是否不为空?

有一个不等式运算符,

a ~= b

尽管它很少被使用,因为通常只写 a = b ifFalse: [ ...]

会更好

但这还不是全部,and: 接受一个块,而不是布尔值

所以

contact password = contact confirmPassword and: firstTime = false

其实应该是

contact password = contact confirmPassword and: [ firstTime = false ]

如果你想要 shorthand 变体,你可以使用 &

contact password = contact confirmPassword & (firstTime = false)

不同之处在于 and: 块只有在接收者为真时才会被评估。如果 and: 块依赖于接收方的真实性,例如 a ~= 0 and: [ x / a = b ],这很重要。如果您使用 & 或忘记了块,这将是一个 ZeroDivide 错误。

最后,您可以通过发送 isEmptyifEmpty: 消息来检查字符串是否为空,例如

myString ifEmpty: [ ... ] 或等价地 myString isEmpty ifTrue: [ ... ]

所以你可以这样写你的条件例如:

contact password = contact confirmPassword & firstTime not & contact password isEmpty ifTrue: [ ^ false ]

Pharo 确实有不等式:

anObject ~= otherObject

这相当于

(anObject = otherObject) not

Pharo(连同任何其他 Smalltalk 或纯对象语言)没有的是 "operator"(这是一个数学函数)。

在 Pharo 中,=~= 都不是运算符,而是发送给对象的简单消息。在这种情况下意味着:获取对象 anObject 并向他发送带有参数 otherObject.

的消息 ~=

它具有某些实际效果,例如您可以定义自己的 =~= 消息...并且您可以检查它们是如何实现的(甚至可以修改它们,尽管我如果你想保留系统,不推荐给你 运行 :) )

关于空字符串,你有几种比你现在做的更好的方法,这是最简单的(也是更好的):

aString ifEmpty: [ ^ false ].

... 或者您也可以检查 nil(有时您需要它):

aString isEmptyOrNil ifTrue: [ ^ false ].

... 或者您可以检查大小(零表示空,不是吗?):

aString size = 0 ifTrue: [ ^ false ]

还有其他的,但这些很快就会浮现在脑海中。请注意,最好的方法是使用 ifEmpty: 消息。此外,如果您寻找 ifEmpty: 的实现者,在 Pharo 中使用 spotter(按 shift+enter)或选择 ifEmpty: 并按 cmd+m(如果 mac)或 ctrl+m(如果使用 linux/windows),您会发现在实现它的同一个 class 中还有一系列您可以使用的有趣消息:ifEmpty:ifNotEmpty: 等。

编辑:格式化。

编辑:我会这样写你的代码:

[ contact password = contact confirmPassword 
  and: [ firstTime not 
  and: [ contact password notEmpty ]]]
whileFalse: [ code ]

通知如下:

  • and: 参数的方括号。这是因为它们也是接收块参数的消息(不是操作符),该块参数被延迟评估,然后使表达式更加高效。
  • firstTime notfirstTime = false.
  • 等效(但在 Pharo 编程风格中更易读)
  • contact password notEmpty 是检查是否为空而不将控制权传递给块的方式。这等同于 contact password isEmpty not 这也是编写代码的有效方式(但不够简洁)。