Ruby MatchData post_匹配意外行为

Ruby MatchData post_匹配意外行为,ruby,regex,Ruby,Regex,我将特殊变量$”与方法MatchData\post\u match进行比较。特殊变量工作正常,但方法post_匹配失败 这很好: m = /b/.match("abc") # => #<MatchData "b"> m.post_match # => "c" "abc".match(/b/) # => #<MatchData "b"> $' # => "c" m=/b/.match(“abc”) # => # m、 赛后 #=>“c” “abc

我将特殊变量
$”
与方法
MatchData\post\u match
进行比较。特殊变量工作正常,但方法post_匹配失败

这很好:

m = /b/.match("abc")
# => #<MatchData "b">
m.post_match
# => "c"

"abc".match(/b/)
# => #<MatchData "b">
$'
# => "c"
m=/b/.match(“abc”)
# => #
m、 赛后
#=>“c”
“abc”。匹配(/b/)
# => #
$'
#=>“c”
这失败了:

"abc".match(/b/)
# => #<MatchData "b">
MatchData.post_match
# => NoMethodError: undefined method `post_match' for MatchData
“abc”。匹配(/b/)
# => #
MatchData.post\u匹配
#=>NoMethodError:MatchData的未定义方法“post_match”

我希望得到相同的输出
'c'
。为什么会失败?我缺少什么?

您应该调用matchdata实例上的
post\u match

match_data = "abc".match(/b/)
# => #<MatchData "b">
match_data.post_match
# => "c"
match_data=“abc”。匹配(/b/)
# => #
匹配数据。后匹配
#=>“c”

带有
$
前缀的全局变量很难处理。它可以在任何地方更改,而且很难跟踪。此外,每次进行正则表达式匹配时,变量
$”
都会不断变化。当您在嵌套循环中进行正则表达式匹配时,这可能会成为一个问题;无论何时在内循环中执行某些操作,都可能会打乱外循环中的最后一个匹配。反之亦然。或者,当您在进行另一场比赛后想要参考上一场比赛时,您会遇到麻烦


通过使用match data实例,您可以将其指定为局部变量,并在复杂情况下跟踪多个match data。

您在类
MatchData
上调用
post\u match
,但它不是类方法-您必须在
MatchData
的实例上调用它。谢谢!因此,似乎特殊变量$'更好。什么是一个好的例子,赛后比赛是优越的?如果魔术发生在幕后的特殊变量上,为什么要创建MatchData对象呢?魔术是优秀开发人员的第一个敌人,通常是一个邪恶的东西。