Ruby Hacks You Have Never Ever Used
💎 Ruby Hacks You’ve Never Ever Used (But Should!) 🚀
Ruby is already a beautiful language—simple, elegant, and developer-friendly. But beneath its simplicity, there are hidden hacks and tricks that even seasoned developers rarely touch. 🤫
In this blog, we’ll uncover Ruby hacks you’ve probably never used before—with clear use cases, code examples, and pro tips. Let’s make your Ruby coding smarter and cooler! 😎✨
1️⃣ tap
– Debug & Chain Like a Pro 🔍
The tap
method lets you “tap into” an object, run operations, and still return the object itself.
Example: Debugging in the middle of a chain
user = { name: "Raj", age: 27 }
.tap { |u| puts "Before update: #{u}" }
.merge(age: 28)
.tap { |u| puts "After update: #{u}" }
👉 Output:
Before update: {:name=>"Raj", :age=>27}
After update: {:name=>"Raj", :age=>28}
💡 Tip: Use tap
to peek into objects while chaining methods without breaking the flow. Perfect for debugging or logging!
2️⃣ then
– Functional Style ✨
Introduced in Ruby 2.6, then
works like tap
but returns the block result instead of the object.
Example: Chained transformations
(5).then { |n| n * 2 }
.then { |n| "Result is #{n}" }
# => "Result is 10"
💡 Tip: Combine tap
and then
wisely—tap
for debugging, then
for transformations.
3️⃣ __send__
– Call Hidden Methods 🕵️
Sometimes method names clash with Ruby keywords or are private. Enter __send__
.
Example: Accessing a method that collides with keywords
class Weird
def class
"I hacked Ruby 😅"
end
end
obj = Weird.new
puts obj.__send__(:class) # => "I hacked Ruby 😅"
💡 Tip: Use carefully—overusing __send__
can lead to confusing code. Best for meta-programming cases.
4️⃣ ||=
– The Lazy Saver 💾
A shorthand way to set a value only if it’s not already set.
Example:
name ||= "Guest"
# If name already has a value, it won’t be overwritten.
💡 Tip: Perfect for memoization in methods.
def expensive_call
@result ||= perform_heavy_task
end
5️⃣ Hash#fetch
with Defaults 🔑
Using hash[:key]
can give you nil
. fetch
makes you intentional.
Example:
user = { name: "Raj" }
puts user.fetch(:name, "Guest") # => "Raj"
puts user.fetch(:age, 20) # => 20
💡 Tip: Avoids nil
errors and makes your code more predictable.
6️⃣ Safe Navigation Operator &.
🚦
No more nil
checking nightmares.
Example:
user = nil
puts user&.name # => nil (instead of crashing)
💡 Tip: Combine with chaining when dealing with APIs or optional objects.
7️⃣ %w
and %i
for Arrays & Symbols 🚀
A cleaner way to define arrays and symbols.
Example:
fruits = %w[apple banana mango]
roles = %i[admin editor viewer]
💡 Tip: Cleaner, faster, and avoids unnecessary quotes or commas.
8️⃣ Enumerator#lazy
– Infinite Magic ♾️
Process infinite or large data without blowing up memory.
Example: Infinite sequence
lazy_numbers = (1..Float::INFINITY).lazy.select { |n| n.even? }
puts lazy_numbers.first(5) # => [2, 4, 6, 8, 10]
💡 Tip: Use lazy
for APIs or huge datasets when you don’t want to load everything into memory.
9️⃣ Flip-Flop Operator ..
and ...
⚡
Yes, Ruby has a flip-flop operator often overlooked!
Example: Within conditions
(1..10).each do |i|
puts i if (i == 3)..(i == 7)
end
# => 3,4,5,6,7
💡 Tip: Useful in parsing ranges or line-matching in files.
🔟 Monkey Patching with Refinements 🐒
Instead of globally monkey-patching, use refinements to limit scope.
Example:
module StringExtensions
refine String do
def shout
upcase + "!!!"
end
end
end
using StringExtensions
puts "hello".shout # => HELLO!!!
💡 Tip: Always prefer refinements over direct monkey-patching to keep your code safe.
🎯 Final Pro Tips
✨ Start small—try one hack in your next Ruby project.
✨ Use tap
and then
for cleaner pipelines.
✨ Use lazy
for big datasets.
✨ Always keep readability first—hacks are fun, but clarity wins.
🚀 Conclusion
Ruby is like an iceberg—most developers only see the surface, but deep down, it has powerful hacks that make coding smarter and more enjoyable. 💎
Use these hacks wisely, and you’ll write cleaner, faster, and more elegant Ruby code than ever before! 🌟
© Lakhveer Singh Rajput - Blogs. All Rights Reserved.