评估Pharo中的不平等

时间:2016-01-17 13:40:35

标签: smalltalk boolean-logic pharo boolean-expression squeak

由于我不知道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]

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

2 个答案:

答案 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错误。

最后,您可以通过发送isEmptyifEmpty:消息来检查字符串空虚,例如

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 notfirstTime = false相同(但在Pharo编程风格中更易读)。
  • contact password notEmpty是如何在没有将控件传递给块的情况下检查为空的,如果出现空的话。这相当于contact password isEmpty not,这也是编写代码的有效方式(但不太简洁)。