string - 在 Smalltalk 中,如何从数组中选择字符串和整数

标签 string select integer smalltalk pharo

使用 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/

相关文章:

ios - 如何在 Xcode 5 中将数字替换为图像

java - 当我们使用 String 的 intern 方法时创建了多少个对象

javascript - 在 javascript 中,使用 eval() 将下拉列表中选择的文本与数组相匹配是一种不错的用法,还是我缺少更好的方法来做到这一点?

python - 从列表的不同元素中减去一个值

c++ - 如何在C++中输入整数而不使用 ">>"

c - 为什么这个查找字符串中第一个唯一字符的 C 程序太慢了?

javascript - 如何为两个元素设置一个事件处理程序?

SQL Server - 创建自定义自增字段

C++ I/O 多路复用服务器过早关闭连接

java - Android 首选项错误, "String cannot be cast to int"