评估法罗中的不平等



由于我不知道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 ]

如果您想要速记变体,您可以使用&

contact password = contact confirmPassword & (firstTime = false)

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

最后,您可以通过将其发送到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或纯对象语言)是"运算符"(这是一个数学函数)。

在 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),您会发现在同一类中实现它还有一系列您可以使用的有趣消息: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这也是编写代码的有效方式(但不太简洁)。

相关内容

  • 没有找到相关文章

最新更新