Smalltalk Pharo中的评价不等式

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]) 我做错了什么?有没有更好的方法来检查字符串是否为空 有一

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

[ 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
    firstTime=false
    等效(但在Pharo编程风格中更清晰)
  • 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 ]