Hacker News new | past | comments | ask | show | jobs | submit login

No mention of pattern matching being used with a case statement:

https://docs.ruby-lang.org/en/3.0/syntax/pattern_matching_rd...

This is where some real magic happens.




Pattern matching gets even more fun with the rightward-assignment syntax and additional conditionals. Here's a single example case from the UUID/GUID library I'm working on where the constructor method takes arbitrary positional arguments, many combinations of which may yield a valid UUID. This particular case matches the components of a Microsoft-style GUID so it can handle the endianness appropriately:

  in [::Integer => data1, ::Integer => data2, ::Integer => data3, ::Array => data4] if (
    data1.bit_length.<=(32) and data2.bit_length.<=(16) and data3.bit_length.<=(16) and (
      data4.size.eql?(8) and data4.all?(&::Integer::method(:===)) and data4.max.bit_length.<=(8)
    )
  ) then


FIY, you can write `data4.all?(Integer)` because `all?` can take a pattern instead of a block, and it uses the === (just like case...when)

I just learned this myself from another comment in this thread.

UPD: why do you write `obj.<=(16)` instead of `obj <= 16`? is this a performance thing or a matter of style or something else?


Just a style thing. I find it less visually overwhelming when every statement that contributes a true/false is visually contiguous. You can see it in context here if curious: https://github.com/okeeblow/DistorteD/blob/NEW%E2%80%85SENSA...


OP has updated it off the back of this comment.

https://www.akshaykhot.com/ruby-switch-statement#pattern-mat...


Thanks for pointing it out. I've updated it.




Consider applying for YC's Fall 2025 batch! Applications are open till Aug 4

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: