Map 测试地图中成员资格的常用方法!在Rebol 2和Rebol 3中工作?

Map 测试地图中成员资格的常用方法!在Rebol 2和Rebol 3中工作?,map,key,rebol,rebol3,Map,Key,Rebol,Rebol3,在Rebol 2中有一个杂凑!输入和地图!类型查找和选择功能以及基于路径的选择都支持这两种功能: >> m: to map! [someKey someValue] == make hash! [someKey someValue] >> m/someKey == someValue >> select m 'someKey == someValue 要检测到某个密钥不在地图中,可以使用“查找”和“对无进行测试” >> find m 'som

在Rebol 2中有一个杂凑!输入和地图!类型查找和选择功能以及基于路径的选择都支持这两种功能:

>> m: to map! [someKey someValue]
== make hash! [someKey someValue]

>> m/someKey
== someValue

>> select m 'someKey
== someValue
要检测到某个密钥不在地图中,可以使用“查找”和“对无进行测试”

>> find m 'someOtherKey
== none
但在这种情况下,基于路径的选择将出现错误:

>> m/someOtherKey
** Script Error: Invalid path value: someOtherKey
** Near: m/someOtherKey
另一方面,REBOL3只有MAP!。但只查找和选择支持系列类型,并映射!不再被视为一个系列。我看到的与贴图交互的唯一方式是通过路径选择,这在非成员情况下不会引发错误:

>> m/someOtherKey
== none
…如果您的密钥位于变量或字符串中,则必须使用PAREN

>> var: 'someKey
== someKey

>> m/(var)
== someValue
这在REBOL2中也适用,但同样需要注意的是,当您请求不存在的东西时,会抛出一个错误,而不是不返回任何错误

如果我没有弄错,路径选择是从REBOL2和REBOL3中的键检索值的常用方法。尽管如此,我并没有看到一种常见的测试缺乏会员资格的方法。如何处理这个问题?

需要注意三件事:

与您的问题最直接相关的是:select在Rebol 3中也可以正常工作,如下交互所示:

>> system/version
== 2.100.111.4.4  ; That's Rebol 3 A111.

>> m: map [a 1 b 2 c 3]
== make map! [
    a 1
    b 2
    c 3
]

>> select m 'b
== 2

>> select m 'd
== none
通过查看R3中选择的规格,例如?series,我们还很快发现它接受以下类型的值作为第一个参数:series!,港口城市地图对象没有

R2真的没有地图!类型它是用散列伪造的!作为R2/前向兼容层的一部分。看看你从地图上得到了什么结果![a 1 a 2]在R2和R3中,看看这会对您造成什么影响

请注意,使用select,您无法真正区分没有任何关联值的键或与[none]关联为值的键。如果您真的需要这种区分,在R3中很容易做到,您可以使用的单词来检索地图的键!:

然而,这还没有被移植到R2

然而,另一种依赖于实现内部的可移植方法是转换map!R3或散列!R2回到一个街区!,并使用extract仅获取密钥:

 >> m: to map! [a 1 b 2]
 >> extract to block! m 2
 == [a b]

啊!我检查了FIND,发现它只适用于系列类型,然后也没有检查SELECT。你说的对!。永远不要重新打字。我选择归咎于抗生素-
 >> m: to map! [a 1 b 2]
 >> extract to block! m 2
 == [a b]