Latest in branch 2.3
2.3.8
Released 17 Oct 2018
(7 years ago)
SoftwareRuby
Version2.3
Status
End of life
Initial release2.3.0
25 Dec 2015
(10 years ago)
Latest release2.3.8
17 Oct 2018
(7 years ago)
End of bug fixes28 Mar 2018
(Ended 8 years ago)
End of life31 Mar 2019
(Ended 7 years ago)
Release notes https://ruby-lang.org/en/news/2018/10/17/ruby-2-3-8-released/
Source codehttps://github.com/ruby/ruby/tree/v2_3_8
Documentationhttps://ruby-doc.org
Downloadhttps://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.8.tar.gz
Ruby 2.3 ReleasesView full list

What Is New in Ruby 2.3

Category Key Changes
New Features Frozen String Literals Pragma, Safe Navigation Operator, Hash comparison, Hash#dig and Array#dig
Performance Frozen string deduplication, garbage collection improvements
Deprecations DL and Fiddle warnings
Standard Library New did_you_mean gem, updated RubyGems, RDoc, and JSON

How does the frozen string literal pragma change Ruby development?

The frozen string literal pragma is a new directive that makes all string literals in a file immutable by default. You enable it by placing a magic comment at the top of your file: # frozen_string_literal: true. This can significantly reduce memory usage through object deduplication.

In practice, this means any attempt to modify a string literal will raise a FrozenError. This change helps prevent accidental mutations and promotes safer, more predictable code. You'll need to explicitly use String#dup or the + operator if you need mutable strings.

What makes the safe navigation operator useful for Rubyists?

The safe navigation operator &. provides a concise way to avoid NoMethodError when calling methods on potentially nil objects. It's similar to features found in other languages like C# and Swift.

Instead of writing verbose conditional checks, you can now chain method calls safely: user&.profile&.address. If any part of the chain is nil, the expression returns nil instead of raising an error. This cleans up code that deals with nested optional objects.

How do Hash comparisons improve code readability?

Ruby 2.3 adds comparison operators (>, >=, <, <=) to Hash, allowing you to check if one hash includes all key-value pairs of another. This makes it easier to verify that a hash contains at least the expected elements.

For example, {a: 1, b: 2} >= {a: 1} returns true. This is particularly useful in testing scenarios where you want to check that a response contains certain attributes without worrying about additional ones.

What are the benefits of the #dig method for nested structures?

The Hash#dig and Array#dig methods provide a safe way to access deeply nested values without multiple nil checks. They help eliminate lengthy conditional chains when working with complex data structures from APIs or configuration files.

Instead of writing obj && obj[:a] && obj[:a][:b], you can simply use obj.dig(:a, :b). If any intermediate value is nil, the method returns nil gracefully. This pattern is especially valuable when parsing JSON responses or configuration data.

How does garbage collection improve in Ruby 2.3?

The garbage collector gets incremental processing capabilities, which helps reduce pause times during collection cycles. Instead of stopping the entire program for full GC runs, it can now work in smaller increments spread across time.

This matters because it leads to more consistent application performance, especially important for web servers and long-running processes. You'll notice fewer sudden latency spikes during garbage collection events.

FAQ

Should I immediately enable frozen string literals in all my files?
Not necessarily. While the memory savings are real, enabling it everywhere could break existing code that modifies string literals. Start with new files or gradually migrate existing code after testing for mutations.

Does the safe navigation operator work with methods that take arguments?
Yes, it works exactly like the regular dot operator but with nil safety. You can write obj&.method(arg1, arg2) and it will call the method if obj isn't nil, otherwise return nil.

What happens with Hash comparison when values are different?
Hash comparison only checks if the left hash contains all the key-value pairs of the right hash. If the same key has different values in each hash, the comparison will return false.

Can I use #dig with mixed Arrays and Hashes?
Absolutely. You can chain through different structure types: data.dig(:users, 0, :name) would access the first user's name in a hash containing an array of users.

Are there any breaking changes I should worry about?
The main potential breakage comes from the frozen string literals pragma if enabled. The DL and Fiddle deprecations might affect projects using those libraries, but most applications won't be impacted.

Releases In Branch 2.3

VersionRelease date
2.3.817 Oct 2018
(7 years ago)
2.3.728 Mar 2018
(8 years ago)
2.3.614 Dec 2017
(8 years ago)
2.3.514 Sep 2017
(8 years ago)
2.3.430 Mar 2017
(9 years ago)
2.3.321 Nov 2016
(9 years ago)
2.3.215 Nov 2016
(9 years ago)
2.3.126 Apr 2016
(10 years ago)
2.3.025 Dec 2015
(10 years ago)
2.3.0-preview211 Dec 2015
(10 years ago)
2.3.0-preview111 Nov 2015
(10 years ago)