Rust Guide > Documentation > Iterators > Position

Introduction

The position function in Rust is a method provided by the Iterator trait that allows you to find the index of the first element in an iterator that satisfies a given predicate. It returns an Option, where Some(index) indicates the position of the first matching element and None indicates that no elements matched the predicate. This function is useful for searching within collections.

Syntax

The basic syntax of the position function is as follows:

iterator.position(|item| {
    // predicate logic
})

Here, iterator is any type that implements the Iterator trait, and |item| is a closure that defines the predicate to be tested against each element.

Example Usage

Example 1: Finding the Position of an Element

fn main() {
    let numbers = vec![1, 2, 3, 4, 5];
    let pos = numbers.iter().position(|&x| x == 3);
    println!("{:?}", pos); // Output: Some(2)
}

Example 2: Finding the Position of a Character in a String

fn main() {
    let text = "hello";
    let pos = text.chars().position(|c| c == 'l');
    println!("{:?}", pos); // Output: Some(2)
}

Example 3: Finding the Position of the First Even Number

fn main() {
    let numbers = vec![1, 3, 5, 6, 7];
    let pos = numbers.iter().position(|&x| x % 2 == 0);
    println!("{:?}", pos); // Output: Some(3)
}

Example 4: No Element Satisfies the Predicate

fn main() {
    let numbers = vec![1, 3, 5, 7];
    let pos = numbers.iter().position(|&x| x % 2 == 0);
    println!("{:?}", pos); // Output: None
}

Example 5: Finding the Position in a Slice

fn main() {
    let slice: &[i32] = &[10, 20, 30, 40, 50];
    let pos = slice.iter().position(|&x| x == 30);
    println!("{:?}", pos); // Output: Some(2)
}

Considerations

  • The position method returns None if no elements match the predicate.
  • The search stops as soon as a matching element is found, making the method efficient for large collections where the condition might be met early.
  • The position method consumes the iterator up to the point where the predicate returns true, so the iterator cannot be reused without being re-created.
  • Ensure the closure used in position does not have side effects, as it may not run for all elements.

See Also

  • find - Searches for an element of an iterator that matches a predicate and returns a reference to it.
  • any - Tests whether any element of an iterator matches a predicate.
  • all - Tests whether all elements of an iterator match a predicate.
  • enumerate - Adds a counter to an iterator, returning an iterator of pairs where the first element is the counter and the second is the item.