对nil应用Ruby的match操作符的预期行为是什么?具体来说,捕获变量应该发生什么,为什么?此代码
nil
"a1c" =~ /.*(\d).*/ puts $1 nil =~ /.*(\d).*/ puts $1 puts $1.nil?
产生以下结果:
1 1 false
我的理解是,一个失败的匹配会将所有的捕获变量重置为nil。如果是这样的话,为什么在尝试与nil匹配之后,$1仍然是1?(我试图找到解释预期行为的文档;但是,我的谷歌技能失败了。
$1
xxhby3vn1#
NilClass#=~的关键是它不会匹配失败,它总是返回nil。引用自文档:
NilClass#=~
nil =~ other → nil
虚拟模式匹配-始终返回nil。查看它的源代码,这个方法非常简单,除了返回nil之外什么也不做:
static VALUE nil_match(VALUE obj1, VALUE obj2) { return Qnil; }
这个conversation in the Ruby issue tracker在这个上下文中也可能是相关的。
goucqfw62#
在Ruby〈3.2.0中,NilClass#=~实际上是由Object#=~中的父类Object实现的。这是一个回退方法,可以被Object的子类覆盖。例如String或Regexp。Object#=~方法在Ruby 2.6.0中被弃用,最终在Ruby 3.2.0中被删除。这些版本直接实现了NilClass#=~。基本的Object#=~和NilClass#=~方法本身不执行匹配,只是返回nil,而不设置/重置任何全局魔术变量。这使得该方法对所有对象都可用,但只对实现重写方法的对象执行有意义的操作。
Object#=~
Object
String
Regexp
2条答案
按热度按时间xxhby3vn1#
NilClass#=~
的关键是它不会匹配失败,它总是返回nil
。引用自文档:
虚拟模式匹配-始终返回nil。
查看它的源代码,这个方法非常简单,除了返回
nil
之外什么也不做:这个conversation in the Ruby issue tracker在这个上下文中也可能是相关的。
goucqfw62#
在Ruby〈3.2.0中,
NilClass#=~
实际上是由Object#=~
中的父类Object
实现的。这是一个回退方法,可以被Object
的子类覆盖。例如String
或Regexp
。Object#=~
方法在Ruby 2.6.0中被弃用,最终在Ruby 3.2.0中被删除。这些版本直接实现了NilClass#=~
。基本的
Object#=~
和NilClass#=~
方法本身不执行匹配,只是返回nil
,而不设置/重置任何全局魔术变量。这使得该方法对所有对象都可用,但只对实现重写方法的对象执行有意义的操作。