crystal-lang - 在水晶中为什么我需要做matches.try &.[0]
问题描述
这是一些代码:
matches = /\/([a-z]+)\/(\d+)\/state\/([a-z]+)/.match(address) # line 1
puts matches[0]? # line 2
puts matches.try &.[0] # line 3
matches
数据类型(Regex::MatchData | Nil)
根据typeof
. 然而,第 2 行,指的是matches[0]
失败并出现编译错误。而且我根本不明白第3行!
有人可以澄清一下吗?
解决方案
第 2 行:正如你所说,类型matches
是(Regex::MatchData | Nil)
. 万一它碰巧是nil
,它就没有#[]?
方法,这会使类型检查器生气。您应该先检查是否match
成功:
matches = /\/([a-z]+)\/(\d+)\/state\/([a-z]+)/.match(address)
if matches
puts matches[0]?
end
在里面if
,类型matches
只是Regex::MatchData
(因为我们排除了Nil
可能性),类型检查器可以安静地休息。
如果您确定您的字符串将匹配,您可以使用 来安抚类型检查器not_nil!
,但如果您对数据一致性的信心是没有根据的,那么这会带来运行时错误的可能性:
puts matches.not_nil![0]?
第 3 行:#try
将执行该块,除非调用者是nil
,当它返回时nil
。不需要警卫,因为#try
已明确定义 on Nil
(以及 on Object
)。
它使用块的快捷语法,其中&.[0]
有点等价于{ |x| x[0] }
.
推荐阅读
- typescript - 管道限制逆变函数
- asp.net - 如何发布字典列表
- spring - 使用 MockMvc 集成测试用户更新控制器
- python-3.x - Pandas Python中groupby时的列错误
- python - 有没有办法通过它的主要索引来分割一个列表?
- javascript - AngularJS 的继承控制器
- python - 将字母数字字符串屏蔽为类似格式
- windows - Windows systemprofile 目录根据用户显示不同
- python - Can't import scikit-learn: ImportError: DLL load failed: 找不到指定的程序
- python - 如何在 pycharm (windows 10) 上安装 numpy 1.18.1