使用 Pharo ,我有一个集合,例如
array := #('up' '4' 'b').
我想使用 select:
创建一个仅包含数字(前提是它们小于 20)和特定字符串的集合 - 在本例中为“up”和“4”
我试过:
array select: [:each | (each='up') | (each asInteger < 50)].
这导致 MessageNotUnderstood
因为receiver of "<" is nil
.
我想我必须创建一个局部变量 x:= each asInteger
, 但无法解决。
最佳答案
你得到一个 MessageNotUnderstood
因为你的代码试图测试是否 'b' asInteger
(这是 nil
,因为 b
不是整数)是 < 20
(或 < 50
;您的文本和代码中有不同的数字)。因此,您需要做的就是先测试每个数组项是否为数字,然后再将其视为数字。
这应该适用于 Pharo 工作区:
| array |
array := #('up' '4' 'b' '22').
^array select: [ :each | each = 'up'
or: [ each isAllDigits and: [ each asInteger < 20 ] ] ]
检查结果给出 #('up' '4')
正如预期的那样。
请注意,我正在检查每个字符串是否“由所有数字组成”,并且只有在这种情况下才进行比较。另请注意,我使用的是 or:
和 and:
,它只在需要时评估 block 参数,而 |
和 &
无论如何评估双方。
你也可以创建一个局部变量,正如你所说的那样,但它看起来有点笨拙(我不会调用变量 x
... 除非它是一个 x 坐标):
| array |
array := #('up' '4' 'b' '22').
^array select: [ :each |
each = 'up' or: [
| integerOrNil |
integerOrNil := each asInteger.
integerOrNil notNil and: [ integerOrNil < 20 ] ] ]
关于string - 在 Smalltalk 中,如何从数组中选择字符串和整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30491014/