regexp/regexp_subclass_dispatch.rb
tests/_examples/regexp/regexp_subclass_dispatch.rb in the metorex repository.
# A Regexp subclass's own methods answer before Regexp's, and `super`
# reaches the pattern it was built with.
class LoggedPattern < Regexp
def match(*arguments)
puts "match #{arguments.inspect}"
super
end
def source
"logged:#{super}"
end
end
pattern = LoggedPattern.new("m.")
p pattern.match("meter")[0]
p pattern.source
# String#match hands the work to the pattern.
p "meter".match(pattern)[0]
# A subclass instance built by `new` is not frozen, and `initialize` on it
# again refuses.
p pattern.frozen?
begin
pattern.send(:initialize, "x")
rescue TypeError => problem
p problem.message
end
Output:
match ["meter"]
"me"
"logged:m."
match ["meter"]
"me"
false
"already initialized regexp"