由于我不知道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 ]
,这一点很重要。如果您使用了&
或忘记了该块,这将是一个零除错误。
最后,您可以通过将其发送到isEmpty
或ifEmpty:
消息来检查字符串空性,例如
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 not
与firstTime = false
相当(但在 Pharo 编程风格中更清晰)。 -
contact password notEmpty
是检查空而不在发生空时将控制权传递给块的方式。这等同于contact password isEmpty not
这也是编写代码的有效方式(但不太简洁)。