将 Ruby 的匹配运算符应用于
nil
的预期行为是什么?
具体来说,捕获变量应该发生什么以及为什么?
这段代码
"a1c" =~ /.*(\d).*/
puts $1
nil =~ /.*(\d).*/
puts $1
puts $1.nil?
产生这个结果:
1
1
false
我的理解是,失败的匹配会将所有捕获变量重置为
nil
。如果是这样,为什么在尝试与 $1
匹配后 nil
仍然是 1?
(我试图找到解释预期行为的文档;但是,我的 Google 技能让我失望了。)
在Ruby中< 3.2.0,
NilClass#=~
实际上是由其父类Object
在Object#=~
中实现的。这是一个回退方法,可以被 Object
的子类覆盖,例如 String
或 Regexp
。 Object#=~
方法在 Ruby 2.6.0 中被弃用,最终在 Ruby 3.2.0 中被删除。这些版本直接实现了NilClass#=~
。
基本
Object#=~
resp。 NilClass#=~
方法自己不执行匹配,只是返回 nil
而不设置/重置任何全局魔术变量。这具有该方法可用于所有对象的效果,但仅对实现重写方法的对象执行有意义的操作。