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])
我究竟做错了什么?有没有更好的方法来检查字符串是否为空?
有一个不平等的运算符,
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错误.
最后,您可以通过发送isEmpty或ifEmpty:消息来检查字符串空白,例如
myString ifEmpty: [ ... ]
或者等价的
myString isEmpty ifTrue: [ ... ]
所以你可以编写你的条件,例如如下:
contact password = contact confirmPassword & firstTime not & contact password isEmpty ifTrue: [ ^ false ]
Run Code Online (Sandbox Code Playgroud)
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编写代码的有效方式(但不太简洁).| 归档时间: |
|
| 查看次数: |
169 次 |
| 最近记录: |