由于我不知道Pharo smalltalk中存在任何不等式运算符,因此很难检查字符串的不等式。这是我目前的代码:
RSpec.describe User, type: :model do
let(:user) { FactoryGirl.build(:user) }
# other what you need
即这部分:
[ contact password = contact confirmPassword and: firstTime = false and: (contact password = '' ifTrue:[^false])] whileFalse: [ code]
我做错了什么?有没有更好的方法来检查字符串是否为空?
答案 0 :(得分:6)
有一个不等式运算符,
a ~= b
虽然它很少使用,因为通常更好地编写a = b ifFalse: [ ...]
但并非所有,and:
接受一个块,而不是一个布尔
所以
contact password = contact confirmPassword and: firstTime = false
实际应该是
contact password = contact confirmPassword and: [ firstTime = false ]
如果您想要速记变体,可以使用&
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 ]
答案 1 :(得分:5)
Pharo 确实存在不等式:
anObject ~= otherObject
这相当于
(anObject = otherObject) not
Pharo没有(以及任何其他Smalltalk或纯对象语言)是"运算符" (这是一个数学函数)。
在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),你会发现在同一个类中实现它也可以使用一系列有趣的消息: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
,这也是编写代码的有效方式(但不太简洁)。