评估 Pharo 中的不平等
Evaluate inequality in Pharo
由于我不知道 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 ]
如果你想要 shorthand 变体,你可以使用 &
contact password = contact confirmPassword & (firstTime = false)
不同之处在于 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 ]
Pharo 确实有不等式:
anObject ~= otherObject
这相当于
(anObject = otherObject) not
Pharo(连同任何其他 Smalltalk 或纯对象语言)没有的是 "operator"(这是一个数学函数)。
在 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),您会发现在实现它的同一个 class 中还有一系列您可以使用的有趣消息: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
这也是编写代码的有效方式(但不够简洁)。
由于我不知道 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 ]
如果你想要 shorthand 变体,你可以使用 &
contact password = contact confirmPassword & (firstTime = false)
不同之处在于 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 ]
Pharo 确实有不等式:
anObject ~= otherObject
这相当于
(anObject = otherObject) not
Pharo(连同任何其他 Smalltalk 或纯对象语言)没有的是 "operator"(这是一个数学函数)。
在 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),您会发现在实现它的同一个 class 中还有一系列您可以使用的有趣消息: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
这也是编写代码的有效方式(但不够简洁)。