Pattern Matching (case/in)

Pattern matching with case/in is a Ruby 3 feature that deconstructs arrays and hashes by shape and binds their inner values to variables in a single, readable expression.

Learn Pattern Matching (case/in) in our free Ruby course — a beginner-friendly interactive lesson with worked examples, a practice exercise and a quick…

Part of the free Ruby course at LearnCodingFast — hands-on lessons with examples you run in your browser, plus practice exercises and a quick quiz.

You'll learn array and hash patterns, variable binding, guards, the find pattern, and the one-line => and in forms.

What You'll Learn in This Lesson

1️⃣ Array & Hash Patterns with Binding

A case/in branch matches the structure of a value and binds its parts to new variables. Array patterns match position and length; hash patterns match by key. Add an if guard to refine a match further. A trailing bare key like name: binds the value of :name .

2️⃣ Find Patterns, Types & Alternatives

The find pattern [*, x, *] locates a single element anywhere in an array. You can match by class ( Integer => x binds only if the value is an Integer), and combine choices with | . These compose to express surprisingly rich conditions concisely.

3️⃣ One-Line Patterns: => and in

For quick work you don't need a full case . The rightward-assignment form value => pattern destructures and binds, raising if it doesn't match. The boolean form value in pattern returns true or false — handy in conditions.

Your turn. A shape hash is matched on its :type . Fill in the ___ so the square branch binds the :side value.

Write a method that routes UI events by their shape using case/in . This is a common real-world use of pattern matching — dispatching on the structure of incoming data. Run with ruby events.rb .

📋 Quick Reference — Pattern Matching

Practice quiz

Which keyword introduces structural pattern matching in Ruby 3?

  • case/when
  • match/with
  • case/in
  • switch/case

Answer: case/in. case/in is Ruby 3's structural pattern matching; case/when does value matching with ===.

What happens if no in pattern matches and there is no else clause?

  • It raises NoMatchingPatternError
  • It returns nil
  • It returns false
  • It skips silently

Answer: It raises NoMatchingPatternError. case/in with no matching branch and no else raises NoMatchingPatternError.

In a hash pattern, what does a bare key like name: do?

  • Requires name to equal a string
  • Deletes the key
  • Compares with ===
  • Binds the value of :name to a variable

Answer: Binds the value of :name to a variable. A bare key binds the value of that key to a new local variable of the same name.

What does the find pattern [*, x, *] do?

  • Matches only 3-element arrays
  • Finds a single element anywhere in the array
  • Reverses the array
  • Matches an empty array

Answer: Finds a single element anywhere in the array. The find pattern with two splats locates one element anywhere inside the array.

What does ({ name: "Ada" } in { name: String }) return?

  • true
  • false
  • nil
  • an error

Answer: true. The one-line in form returns true when the value matches the pattern.

What does ([1, "x"] in [Integer, Integer]) return?

  • true
  • nil
  • false
  • an error

Answer: false. "x" is not an Integer, so the structural match fails and in returns false.

What does the one-line form value => pattern do when it does NOT match?

  • Returns false
  • Raises NoMatchingPatternError
  • Returns nil
  • Returns the value

Answer: Raises NoMatchingPatternError. The => rightward-assignment form must match or it raises NoMatchingPatternError.

How do you combine alternative patterns in a single in branch?

  • With &&
  • With or
  • With commas
  • With the | operator

Answer: With the | operator. Alternatives are combined with |, as in: in "warn" | "error".

What does Integer => x do in a pattern?

  • Always binds x
  • Binds x only if the value is an Integer
  • Converts x to an Integer
  • Compares x with ==

Answer: Binds x only if the value is an Integer. A type pattern matches the class first, binding x only when the value is an Integer.

Which methods let your own objects support pattern matching?

  • to_a and to_h
  • match and scan
  • deconstruct and deconstruct_keys
  • each and map

Answer: deconstruct and deconstruct_keys. deconstruct enables array patterns and deconstruct_keys enables hash patterns.