Red语言find函数匹配疑问:字符串参数匹配原因及字符指定方法
关于Red语言中
find函数的三个疑问解答 嘿,这个小发现确实挺有意思的,我来帮你拆解这三个问题:
1. 在Red语言中如何指定字符q?
在Red里,单个字符的标准写法是用#加双引号包裹字符,也就是#"q"——这就是字符字面量的定义方式。举个实际的例子:
char-q: #"q" print type? char-q ; 输出结果: char
你也可以通过字符串提取字符,比如first "q"也能得到#"q",但最直接、可读性最高的还是用#"q"来定义单个字符。
2. 为何传入字符串参数时find搜索仍能成功?
这是Red语言find函数的多态适配设计带来的便利。Red的很多内置函数都做了“用户友好”的适配,find就是典型:当你传入的搜索参数是长度为1的字符串时,find会自动把它当作对应的单个字符来处理,而不是当作子字符串去匹配。
简单说,Red团队考虑到用户在写代码时,可能懒得区分单字符字符串和字符类型,所以帮你做了隐式转换,不用手动把"q"转成#"q"也能正常搜索,降低了使用门槛。
3. 当find被传入字符串而非字符时,它实际上是如何在字符串中定位字符的?
这里要分两种场景来看:
- 如果搜索的字符串长度为1:比如你传的
"q",find内部会先检查这个字符串的长度,确认是1之后,自动将其转换为对应的字符(也就是#"q"),然后遍历目标字符串的每一个字符,逐个比对,找到第一个匹配的位置就返回结果。这个过程和你直接传#"q"的逻辑完全一致。 - 如果搜索的字符串长度大于1:那
find就会切换到子字符串匹配逻辑,比如你搜"sp",它会在目标字符串里找连续的s紧跟p的子序列,找到第一个符合的就返回。
所以你这次用find "rspq" "q"能成功,本质上是find帮你把单字符字符串隐式转成了字符类型再进行匹配的~
内容的提问来源于stack exchange,提问作者Terrence Brannon
相关产品推荐
相关产品推荐

