Brian Candler
5/21/2007 7:51:00 PM
On Tue, May 22, 2007 at 04:13:31AM +0900, RailsToPerl wrote:
> In routing.rb, what is the purpose of the following piece of code:
>
> class Regexp #:nodoc:
> def number_of_captures
> Regexp.new("|#{source}").match('').captures.length
> end
>
>
> Does this method not always return 0?
Empirically, no it doesn't:
$ cat x.rb
class Regexp #:nodoc:
def number_of_captures
Regexp.new("|#{source}").match('').captures.length
end
end
a = /(foo|bar|(baz))/
puts a.number_of_captures
$ ruby x.rb
2
$
I think the reason is that all captures are assigned. If they don't actually
capture anything then they are set to nil.
irb(main):001:0> /(abc)(def)?/.match("abc").captures
=> ["abc", nil]
Otherwise it would be confusing as you might not be able to work out what
had actually been considered. Consider:
irb(main):002:0> /(abc)?(def)(ghi)?/.match("def").captures
=> [nil, "def", nil]
You want the middle capture to be assigned to $2, not $1.
Regards,
Brian.