将 Ruby 的匹配运算符应用于 nil 的预期行为是什么?

问题描述 投票:0回答:2

将 Ruby 的匹配运算符应用于

nil
的预期行为是什么? 具体来说,捕获变量应该发生什么以及为什么?

这段代码

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

产生这个结果:

1
1
false

我的理解是,失败的匹配会将所有捕获变量重置为

nil
。如果是这样,为什么在尝试与
$1
匹配后
nil
仍然是 1?

(我试图找到解释预期行为的文档;但是,我的 Google 技能让我失望了。)

regex ruby
2个回答
1
投票

NilClass#=~
的要点是不会匹配失败。它总是返回
nil
.

引自docs

nil =~ other → nil

虚拟模式匹配——总是返回 nil。

查看源码,这个方法非常简单,除了返回什么都不做

nil

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

Ruby 问题跟踪器中的这个对话也可能与此上下文相关。


0
投票

在Ruby中< 3.2.0,

NilClass#=~
实际上是由其父类
Object
Object#=~
中实现的。这是一个回退方法,可以被
Object
的子类覆盖,例如
String
Regexp
Object#=~
方法在 Ruby 2.6.0 中被弃用,最终在 Ruby 3.2.0 中被删除。这些版本直接实现了
NilClass#=~

基本

Object#=~
resp。
NilClass#=~
方法自己不执行匹配,只是返回
nil
而不设置/重置任何全局魔术变量。这具有该方法可用于所有对象的效果,但仅对实现重写方法的对象执行有意义的操作。

© www.soinside.com 2019 - 2024. All rights reserved.