Feature #17056
openArray#index: Allow specifying the position to start search as in String#index
Description
I have a use case of finding the first matching line within a given section in a file. After finding the line number of the start of the section, I want to find the first match after that line.
My workaround for now is to use with_index
:
lines = pathname.read.lines
section_start_line = lines.index {|line| line.start_with?(/#* #{section_name}/) }
lines.index.with_index {|line, i| i > section_start_line && line.include?(sought) }
I'd like to do it in a more concise way using a feature of Array#index
that I propose here, which is analogous to String#index
.
If the second parameter of String#index
is present, it specifies the position in the string to begin the search:
'abcabc'.index('a') # => 0
'abcabc'.index('a',2) # => 3
I would expect to also be able to do:
'abcabc'.chars.index('a') # => 0
'abcabc'.chars.index('a', 2)
Using such feature, I would be able to do:
lines.index(sought, section_start_line)
This would give Ruby better parity with other programming languages like Python:
>>> list('abcabc')
['a', 'b', 'c', 'a', 'b', 'c']
>>> list('abcabc').index('a')
0
>>> list('abcabc').index('a', 2)
3
End index¶
We can further think of an optional parameter to specify the position to end the search. The following languages allow specifying both start and end indexes:
Ruby's String#index
does not have one, so we could make a separate proposal to add end
to both methods at the same time.