对于简单的任务,直接访问伪变量$1
等可能更短更容易,但是当事情变得复杂时,通过MatchData
实例访问事物是(几乎)唯一的方法。
例如,假设您正在执行嵌套gsub
:
string1.gsub(regex1) do |string2|
string2.gsub(regex2) do
... # Impossible/difficult to refer to match data of outer loop
end
end
在内部循环中,假设您想引用外部的捕获组gsub
。调用$1
,$2
等不会给出正确的结果,因为最后一个匹配数据已通过执行内部gsub
循环而更改。这将是错误的来源。
有必要通过匹配数据引用捕获的组:
string1.gsub(regex1) do |string2|
m1 = $~
string2.gsub(regex2) do
m2 = $~
... # match data of the outer loop can be accessed via `m1`.
# match data of the inner loop can be accessed via `m2`.
end
end
简而言之,如果你想为简单的任务做一些简短的事情,你可以使用伪变量。如果你想让你的代码更加结构化和可扩展,你应该通过匹配数据来访问数据。