As per tradition, a new version of Ruby was released on Christmas Day. Out of the 4,190 file changes since 2.6.0, Ruby 2.7.0 introduces some notable improvements.
REPL
irb
now supports multi-line editing:
2.7.0 > def greeting
2.7.0 > "Hello"
2.7.0 > end
=> :greeting
2.7.0 > greeting
=> "Hello"
Beginless Range
- An experimental feature that allows you to omit the beginning of a range:
Listing.where(sold_price: ..500_000)
# Identical to 1..500_000
Call private method with self
- Allows calling a private method with a literal
self
as the receiver, making it consistent with calling private attribute assignment methods:
def assessment
end
private :assessment
self.assessment
.tally
- Counts the occurence of each element; reducing the need for group by statements:
2.7.0 > ['jab', 'jab', 'hook'].tally
=> { 'jab' => 2, 'hook' => 1 }
Enumerator::Lazy#eager
- Generates non-lazy enumerator from a lazy enumerator:
“This is useful where a normal Enumerable object needs to be generated while lazy operation is still desired to avoid creating intermediate arrays.”
– Yukihiro Matsumoto
2.7.0 > a = %w(foo bar baz)
2.7.0 > e = a.lazy.map {|x| x.upcase }.map {|x| x + "!" }.eager
2.7.0 > p e.class
=> Enumerator
2.7.0 > p e.map {|x| x + "?" }
=> ["FOO!?", "BAR!?", "BAZ!?"]
For the full list of release notes: https://www.ruby-lang.org/en/news/2019/12/25/ruby-2-7-0-released/.