Routing code question


#1

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? It’s always going to match ‘’
with the blank spot before the | and therefore will have no captures.


#2

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.