评估Pharo中的不平等

Ani*_*ing 2 boolean-logic smalltalk squeak boolean-expression pharo

由于我不了解Pharo smalltalk中的任何不等运算符,因此很难检查字符串的不等式.这是我目前的代码:

[ contact password = contact confirmPassword and: firstTime = false and: (contact password = '' ifTrue:[^false])]   whileFalse: [ code]
Run Code Online (Sandbox Code Playgroud)

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

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

Pet*_*nak 6

有一个不平等的运算符,

a ~= b

虽然它很少使用,因为它通常更好地写 a = b ifFalse: [ ...]

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

所以

contact password = contact confirmPassword and: firstTime = false
Run Code Online (Sandbox Code Playgroud)

应该是

contact password = contact confirmPassword and: [ firstTime = false ]
Run Code Online (Sandbox Code Playgroud)

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

contact password = contact confirmPassword & (firstTime = false)
Run Code Online (Sandbox Code Playgroud)

不同之处在于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 ]
Run Code Online (Sandbox Code Playgroud)


Est*_*nLM 5

Pharo 确实存在不平等:

anObject ~= otherObject
Run Code Online (Sandbox Code Playgroud)

这相当于

(anObject = otherObject) not
Run Code Online (Sandbox Code Playgroud)

Pharo没有(以及任何其他Smalltalk或纯对象语言)就像"操作符"(这是一个数学函数).

在菲罗,两者=~=没有运营商,但你要发送的对象简单的信息.在这种情况下意味着:获取对象anObject并向他发送~=带参数的消息otherObject.

它喜欢这样的事实一定的实际后果,你可以定义自己的=,~=消息...你可以检查它们是如何实现的(甚至修改它们,但如果你想保持系统正常运行,我不把它推荐给你: ))

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

aString ifEmpty: [ ^ false ].
Run Code Online (Sandbox Code Playgroud)

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

aString isEmptyOrNil ifTrue: [ ^ false ].
Run Code Online (Sandbox Code Playgroud)

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

aString size = 0 ifTrue: [ ^ false ]
Run Code Online (Sandbox Code Playgroud)

还有其他人,但这些想法很快.请注意,最好的方法是使用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 ]
Run Code Online (Sandbox Code Playgroud)

通知如下:

  • and:参数的方括号.这是因为它们也是接收块参数的消息(而不是运算符),这些参数被懒惰地评估,然后使表达更有效.
  • firstTime not相当于(但在Pharo编程风格中更清晰)firstTime = false.
  • contact password notEmpty是如何在空的情况下检查空而不将控制传递给块.这相当于contact password isEmpty not编写代码的有效方式(但不太简洁).