Project

General

Profile

Feature #17056

Array#index: Allow specifying the position to start search as in String#index

Added by TylerRick (Tyler Rick) about 2 months ago. Updated 21 days ago.

Status:
Open
Priority:
Normal
Assignee:
-
Target version:
-
[ruby-core:99380]

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.

#1

Updated by TylerRick (Tyler Rick) about 2 months ago

  • Description updated (diff)
#2

Updated by TylerRick (Tyler Rick) about 2 months ago

  • Description updated (diff)
#3

Updated by sawa (Tsuyoshi Sawada) about 2 months ago

  • Description updated (diff)
  • Subject changed from Array#index: Allow specifying start index to search like String#index does to Array#index: Allow specifying the position to start search as in String#index

Updated by marcandre (Marc-Andre Lafortune) 28 days ago

👍

I'd like to have optional start and stop arguments for find_index, find, bsearch and bsearch_index.

As mentionned, a typical usecase is to repeat a lookup, but another one is to lookup a range of indices (e.g. which elements of a sorted array are between 10 and 20).

I've had to iterate on the indices instead but it is not elegant and is less performant.

Updated by fatkodima (Dima Fatko) 21 days ago

I have implemented an offset parameter for Array#index - https://github.com/ruby/ruby/pull/3448
Will adjust to more methods if asked.

Also available in: Atom PDF