• Skip to primary navigation
  • Skip to main content
  • Skip to primary sidebar

Justin Joyce

Practical tips and tutorials about software development.

  • Standing Invitation
  • Featured Posts
  • Latest
  • About

Ruby’s safe navigation operator (&.)

Posted Apr 16, 2023 — Updated Jan 10, 2024

Ruby’s safe navigation operator (&.) is a nil-safe way to chain operations.

Let’s say we have a User class, and that class can have first_name and last_name attributes:

me = User.new(first_name: "justin")
me.first_name # "justin"
me.first_name.upcase # "JUSTIN"

# We didn't give me a last_name
me.last_name # nil
me.last_name.upcase # NoMethodError: undefined method `upcase' for nil:NilClass

# using safe navigation, there's no error
me.last_name&.upcase # nil

# you could even chain further
me.last_name&.upcase&.downcase # nil

Without safe navigation, we’d need a more-verbose if check to accomplish the same thing:

# same result as me.last_name&.upcase
if me.last_name
  me.last_name.upcase
else
  nil
end

If you’re familiar with Javascript, ruby’s safe navigation works just like javascript’s optional chaining1.

Note: &. only works when dealing specifically with nil, not false (or any other falsy value):

me.last_name = false
me.last_name&.upcase # NoMethodError: undefined method `upcase' for false:FalseClass

  1. Javascript’s optional chaining actually handles two different falsey values, null and undefined ↩︎

Filed Under: Ruby

Primary Sidebar

Recent Posts

  • Every Built-In Vim Color Scheme (with screenshots)
  • Reverse a string in Python
  • Meeting Cost Calculator
  • Vim find and replace
  • What makes an effective development team

Categories

  • Arrays (5)
  • Command Line (9)
  • Dates (3)
  • Featured (7)
  • Git (7)
  • Golang (5)
  • Javascript (8)
  • Productivity (8)
  • Projects (4)
  • Python (15)
  • Regex (2)
  • Ruby (3)
  • Shell (2)
  • Thoughts (2)
  • Tips (11)
  • Tools (3)
  • Tutorials (1)
  • Vim (4)

Archives

  • July 2024 (1)
  • February 2024 (1)
  • January 2024 (1)
  • December 2023 (1)
  • November 2023 (1)
  • October 2023 (4)
  • September 2023 (1)
  • August 2023 (2)
  • July 2023 (5)
  • June 2023 (3)
  • May 2023 (6)
  • April 2023 (5)
  • March 2023 (5)
  • February 2023 (10)
  • January 2023 (6)
  • December 2022 (7)

Copyright © 2025 · Contact me at justin [at] {this domain}

  • Privacy Policy