将Ruby的match运算符应用于nil时,预期的行为是什么?

gzszwxb4  于 2023-04-05  发布在  Ruby
关注(0)|答案(2)|浏览(106)

nil应用Ruby的match操作符的预期行为是什么?具体来说,捕获变量应该发生什么,为什么?
此代码

"a1c" =~ /.*(\d).*/
puts $1
nil =~ /.*(\d).*/
puts $1
puts $1.nil?

产生以下结果:

1
1
false

我的理解是,一个失败的匹配会将所有的捕获变量重置为nil。如果是这样的话,为什么在尝试与nil匹配之后,$1仍然是1?
(我试图找到解释预期行为的文档;但是,我的谷歌技能失败了。

xxhby3vn

xxhby3vn1#

NilClass#=~的关键是它不会匹配失败,它总是返回nil
引用自文档:

nil =~ other → nil

虚拟模式匹配-始终返回nil。
查看它的源代码,这个方法非常简单,除了返回nil之外什么也不做:

static VALUE
nil_match(VALUE obj1, VALUE obj2)
{
    return Qnil;
}

这个conversation in the Ruby issue tracker在这个上下文中也可能是相关的。

goucqfw6

goucqfw62#

在Ruby〈3.2.0中,NilClass#=~实际上是由Object#=~中的父类Object实现的。这是一个回退方法,可以被Object的子类覆盖。例如StringRegexpObject#=~方法在Ruby 2.6.0中被弃用,最终在Ruby 3.2.0中被删除。这些版本直接实现了NilClass#=~
基本的Object#=~NilClass#=~方法本身不执行匹配,只是返回nil,而不设置/重置任何全局魔术变量。这使得该方法对所有对象都可用,但只对实现重写方法的对象执行有意义的操作。

相关问题