В re.c , строка 3453, упоминается:
Обратите внимание, что last_match
является локальным для потока и области действия метода
метода, который сделал сопоставление с шаблоном.
Поскольку с вашим прокси-объектом вы выполняете вызов match
в method_missing
, он будет виден именно там, как можно увидеть, если вы измените его на
def method_missing(name, *args)
res = @object.send(name, *args)
Kernel.p $~
res
end
UPDATE:
Довольно некрасиво, но, может быть, что-то вроде этого - вариант?
#!/usr/local/bin/ruby19
def set_current_locale(l)
$current_locale = l
ObjectSpace.each_object { | obj |
obj.adjust_locale if obj.respond_to? :adjust_locale
}
end
class LocalizedObject < String
def initialize(hash)
super(hash[$current_locale || "en"])
@hash = hash
end
def adjust_locale
self[0..-1] = @hash[$current_locale || "en"] if @hash
end
end
proxy = LocalizedObject.new({"en" => "foobarbaz", "pt" => "xpto"})
proxy.match(/f.*r/) # => #<MatchData "foobar">
Regexp.last_match # => #<MatchData "foobar">
$~ # => #<MatchData "foobar">
set_current_locale('pt')
proxy.match(/x.*o/) # => #<MatchData "xpto">
Regexp.last_match # => #<MatchData "xpto">
$~ # => #<MatchData "xpto">