Ruby regexp匹配相关伪变量的范围
在以下方面:Ruby regexp匹配相关伪变量的范围,ruby,regex,scope,Ruby,Regex,Scope,在以下方面: def foo p $`, $&, $' end def bar x = $`, y = $&, z = $' p x, y, z end 'abc' =~ /b/ p $`, $&, $' # => 'a', 'b', 'c' foo # => nil, nil, nil bar # => nil, nil, nil 与regexp匹配相关的伪变量似乎在foo中被重置,甚至在bar中的参数接收部分中也被重置。我知道这与作
def foo
p $`, $&, $'
end
def bar x = $`, y = $&, z = $'
p x, y, z
end
'abc' =~ /b/
p $`, $&, $' # => 'a', 'b', 'c'
foo # => nil, nil, nil
bar # => nil, nil, nil
与regexp匹配相关的伪变量似乎在foo中被重置,甚至在bar中的参数接收部分中也被重置。我知道这与作用域有关,但我的理解是,作用域之前和之外的变量通常可以从该作用域内部看到(除了一些与eval、exec等相关的环境),即使不能从外部看到作用域内部的变量
您能告诉我这些与regexp相关的伪变量的作用域的性质吗?与regexp相关的伪变量的行为与全局变量不同,但它们是您在其中使用它们的方法和线程的局部变量 我想这是在“编程Ruby”中提到的——你有副本吗 要解决您的问题:请尝试只将
$backtick
和$&
中的值传递给foo
和bar
,如果它们有异常,让它们引发异常,并让调用方法处理异常,记录$”中的内容,然后重新引发异常:
def foo(x, y)
raise if x != "hello"
end
def caller_of_foo
begin
foo($`, $&) # Ignore this comment: `
rescue
STDERR.puts "foo raised #{$!.inspect}"
STDERR.puts "The remainder of the regexp is #{$'.inspect}"
raise
end
end
与Regexp相关的伪变量的行为与全局变量不同,但它们是使用它们的方法和线程的本地变量
我想这是在“编程Ruby”中提到的——你有副本吗
要解决您的问题:请尝试只将$backtick
和$&
中的值传递给foo
和bar
,如果它们有异常,让它们引发异常,并让调用方法处理异常,记录$”中的内容,然后重新引发异常:
def foo(x, y)
raise if x != "hello"
end
def caller_of_foo
begin
foo($`, $&) # Ignore this comment: `
rescue
STDERR.puts "foo raised #{$!.inspect}"
STDERR.puts "The remainder of the regexp is #{$'.inspect}"
raise
end
end
有没有一种方法可以访问方法定义中的最后一个匹配信息而不将其作为参数传递,如上面的foo或bar中所述?@sawa:为什么要这样做?我使用一个gsub循环来解析一个DSL,对于循环中的每一次运行,都要跟踪匹配位置,以便在发生错误时返回位置信息。我有一个类负责处理错误,因此对于gsub循环中的每次运行,都会记录匹配位置。但是,每次将$`(可能会变大)作为参数传递给方法似乎要花费大量的时间。即使多次使用像x=$`这样的变量,速度也会非常慢。所以我希望有一个方法可以引用上一个匹配,而不需要通过参数。谢谢你的建议。我认为这是我应该走的道路。我将在调用方方法中处理有关错误位置的信息。是否有一种方法可以访问方法定义中的最后一个匹配信息,而无需像上面的foo或bar那样将其作为参数传递?@sawa:为什么要这样做?我正在对一个大文本使用gsub循环来解析DSL,对于循环中的每次运行,希望跟踪匹配位置,以便在发生错误时返回位置信息。我有一个类负责处理错误,因此对于gsub循环中的每次运行,都会记录匹配位置。但是,每次将$`(可能会变大)作为参数传递给方法似乎要花费大量的时间。即使多次使用像x=$`这样的变量,速度也会非常慢。所以我希望有一个方法可以引用上一个匹配,而不需要通过参数。谢谢你的建议。我认为这是我应该走的道路。我将在调用方方法中处理有关错误位置的信息。