11 February 2018
4 min read
This is a reminder of how Ruby evolves through time.
| Version | Release | End of support | End of maintenance |
|---|---|---|---|
| 1.8 | 2003-08-04 | 2012-06-xx | 2014-07-01 |
| 1.9 | 2007-12-25 | 2014-02-23 | 2015-02-23 |
| 2.0 | 2013-02-24 | 2015-02-24 | 2016-02-24 |
| 2.1 | 2013-12-25 | 2016-03-30 | 2017-03-31 |
| 2.2 | 2014-12-25 | 2017-03-28 | 2018-03-31 |
| 2.3 | 2015-12-25 | 2018-03-28 | 2019-03-31 |
| 2.4 | 2016-12-25 | 2019-04-01 | 2020-03-31 |
| 2.5 | 2017-12-25 | 2020-04-05 | 2021-04-05 |
| 2.6 | 2018-12-25 | 2021-04-05 | 2022-04-05 |
| 2.7 | 2019-12-25 | 2022-04-12 | 2023-03-31 |
| 3.0 | 2020-12-25 | 2023-03-31 | TBA |
| 3.1 | 2021-12-25 | TBA | TBA |
| 3.2 | 2022-12-25 | TBA | TBA |
{key: 'value'}?c != 'c'.ordKernel#require_relativeString#prependString#clearIO.write/binwrite/binreadNumeric#stepModule#prepend#to_h #6276Kernel#__dir__ #3346String#lines/chars/codepoints/bytes returns Array instead of Enumerator #6670String#scrub #8414Numeric#bit_length #8700Module#prepend/include are public #8846String#+@/-@ to get mutable and frozen strings, respectively #11782obj&.foo safe navigation operator #11537Array/Hash/Struct#dig #11643 #11688Array#bsearch_index #10730RubyVM::InstructionSequence#to_binary and RubyVM::InstructionSequence.load_from_binary #11788Integer/Float#ceil/floor/truncate with optional digits #12245Integer#digits to extract columns of place-value notation #12447Integer#round with half option, default behavior is round-up #12548 #12958 :even, :up, and :down #12953Array#max/min do not create temporary arrays under certain conditions #12172Regexp#match? does not change global variables #8110Comparable#clamp #10594IO#gets/readline/each_line/readlines/foreach, String#each_line/lines, StringIO#gets/readline/each_line/readlines with chomp option #12553String.new with :capacity to preallocate size #12024String#unpack1 #12752Kernel#yield_self #6721String#delete_prefix/delete_suffix #12694 #13665Array#prepend/append as aliases of Array#unshift/push #12746rescue/else/ensure in do/end blocks #12906Dir.children/each_child #11302Integer.pow(a, b) #12508(1..) and (1...) #12912Array#union/difference #14097Dir#each_child/children #13969Random.bytes #4938Binding#source_location #14230Kernel#system raise with :exception option #14386Kernel.then as alias to Kernel.yield_self #14594String#split yields to block if given #4780File#read/binread/write/binwrite/foreach/readlines without pipes #14245(..1) and (...1) #14799Enumerable#tally #11076Integer#[] now supports range operation #8842def foo(*) bar.foo(*) end #16253Enumerable#filter_map #15323Array#intersection #16155def square(x) = x * x #16746Hash#except #15822Array#intersect? #15198def foo(&) bar(&) end #11256def foo(*) bar(*) enddef baz(**) quux(**) endEnumerator#product #18685