Mastering Option<T> in Rust: 15 Patterns from Beginner to Advanced

A Code-First Guide with Runnable Examples

🚧 This post is under construction 🚧

TL;DR

  • Item 1

Table of Contents

Introduction

Personally, when working in Rust I always struggle a bit with the Some() syntax. I can read and understand it, but the next day when I need to write a line of code to handle an Option<T> I don’t feel comfortable. I’ve been carrying this problem since the beginning and can’t seem to shake it. What’s worse, I can understand code written by others or code generated by Claude or ChatGPT, but for the life of me I can’t write it myself.

Bref ce billet est donc une espèce de de thérapie pendant laquelle je vais essayer de me soigner 😁.

🟢 Beginner Patterns (1-4)

1. Option<T> as a Return Value

Real-world context: Functions that might not have a result (e.g., searching, parsing, optional configuration).

Runnable Example

Copy and paste in Rust Playground

struct Editor {
}

impl Editor {
    fn get_selection(&self) -> Option<String> {
        // Simulate selection: uncomment one to test both cases
        Some("lorem ipsum".to_string())
        // None
    }
}

fn main() {
    let my_editor = Editor {};

    // The if let pattern: unwrap and use the selection only if Some
    if let Some(my_txt) = my_editor.get_selection() {
        println!("Selection: {my_txt}");
    } else {
        println!("No text selected");
    }
}

Read it Aloud

get_selection() returns an Option<String> which contains the selected text as a String or None. The if let pattern checks: “If there is Some text, bind it to my_txt and execute the block. Otherwise, execute the else branch.”

Key Points

  1. Pattern: if let Some(variable) = option_value unwraps only when Some, avoids verbose match
  2. When to use: You only care about the Some case and want a simple else fallback
  3. Pitfall: Don’t confuse with if option_value.is_some() - that doesn’t extract the value

Find More Examples

VSCode search: CTRL+SHIFT+F, enable regex (ALT+R), type: Some\(.+\)$

In Powershell, copy’, paste the lines below

Get-ChildItem -Path "./src" -Filter *.rs -Recurse |
    ForEach-Object {
        # Read file content with line numbers
        Select-String -Path $_.FullName -Pattern 'Some\(.+\)$' -SimpleMatch:$false |
            ForEach-Object {
                # Output file path and line number
                [PSCustomObject]@{
                    File      = $_.Path
                    LineNumber = $_.LineNumber
                    LineText   = $_.Line.Trim()
                }
            }
    }

Webliography

Official Documentation


Back to top

Published on: Nov 29 2025 at 01:00 AM | Last updated: Dec 1 2025 at 04:00 PM

Copyright © 1964-2025 - 40tude