Smalltalk Pharo中的评价不等式
因为我不知道Pharo smalltalk中有任何不等式运算符,所以很难检查字符串的不等式。这是我当前的代码:Smalltalk Pharo中的评价不等式,smalltalk,boolean-logic,pharo,boolean-expression,squeak,Smalltalk,Boolean Logic,Pharo,Boolean Expression,Squeak,因为我不知道Pharo smalltalk中有任何不等式运算符,所以很难检查字符串的不等式。这是我当前的代码: [ contact password = contact confirmPassword and: firstTime = false and: (contact password = '' ifTrue:[^false])] whileFalse: [ code] 即本部分: (联系密码=''如果正确:[^false]) 我做错了什么?有没有更好的方法来检查字符串是否为空 有一
[ contact password = contact confirmPassword and: firstTime = false and: (contact password = '' ifTrue:[^false])] whileFalse: [ code]
即本部分:(联系密码=''如果正确:[^false])
我做错了什么?有没有更好的方法来检查字符串是否为空 有一个不等式运算符
a~=b
尽管它很少被使用,因为通常最好只写a=b ifFalse:[…]
然而,这并不是全部,和:
接受一个块,而不是布尔值
所以
实际上应该是
contact password = contact confirmPassword and: [ firstTime = false ]
如果您想要速记变体,可以使用&
contact password = contact confirmPassword & (firstTime = false)
区别在于,只有当接收器为true时,才会计算和:
块。若和:
块依赖于接收器的真实性,例如a~=0和:[x/a=b]
,这一点很重要。如果您使用了&
或忘记了块,这将是一个零除错误
最后,您可以通过发送isEmpty
或ifEmpty:
消息来检查字符串是否为空,例如
myString ifEmpty:[…]
或同等地
myString如果真的是:[……],则为空。
因此,您可以编写您的条件,例如,如下所示:
contact password = contact confirmPassword & firstTime not & contact password isEmpty ifTrue: [ ^ false ]
Pharo确实存在不平等性:
anObject ~= otherObject
这相当于
(anObject = otherObject) not
Pharo所没有的(以及任何其他Smalltalk或纯对象语言)是“操作符”(这是一个数学函数)
在Pharo中,=
和~=
都不是运算符,而是发送给对象的简单消息。在这种情况下,表示:获取对象一个对象
,并向他发送带有参数其他对象
的消息~=
它具有某些实际后果,比如您可以定义自己的=
,~=
消息。。。您可以检查它们是如何实现的(甚至可以修改它们,但如果您想让系统保持运行,我不建议您这么做:)
关于空字符串,您有几种比现在更好的方法,这是最简单(也更好)的方法:
。。。或者您也可以检查零(有时您需要):
。。。或者您可以检查大小(零表示空,不是吗?):
还有其他的,但我很快就会想到这些。请注意,最好的方法是使用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 ]
通知如下:
参数的方括号。这是因为它们也是消息(而不是运算符),接收一个延迟计算的块参数,从而使表达式更加高效李>和:
与firstTime not
等效(但在Pharo编程风格中更清晰)firstTime=false
是一种在发生空时检查是否为空而不将控制权传递给块的方法。这相当于contact password notEmpty
,这也是编写代码的有效方法(但不太简洁)李>联系人密码isEmpty not
myString='
如果myString
为空,将正确计算为true。
aString ifEmpty: [ ^ false ].
aString isEmptyOrNil ifTrue: [ ^ false ].
aString size = 0 ifTrue: [ ^ false ]
[ contact password = contact confirmPassword
and: [ firstTime not
and: [ contact password notEmpty ]]]
whileFalse: [ code ]