область действия псевдопеременных, связанных с регулярным выражением - PullRequest
1 голос
/ 07 марта 2011

В следующем:

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

псевдопеременные, связанные с соответствием регулярному выражению, похоже, сбрасываются в foo и даже в части, принимающей аргументы в bar. Я знаю, что это как-то связано с областью действия, но, насколько я понимаю, переменную, предшествующую и выходящую за пределы области видимости, обычно можно увидеть внутри этой области (кроме некоторых сред, связанных с eval, exec и т. переменная внутри области видимости не видна снаружи.

Можете ли вы сказать мне природу этих псевдопеременных, связанных с регулярным выражением?

1 Ответ

1 голос
/ 07 марта 2011

Связанные с 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...