I'm not clear on the differences between the "current" version of Ruby (1.8) and the "new" version (1.9). Is there an "easy" or a "simple" explanation of the differences and why it is so different?
For running scripts, you can use the "system" Ruby comes pre-installed on macOS. Ruby 3.1. 0 is the Ruby latest version (3.1. 0 was released Dec 25, 2021).
Since its public release in 1995, Ruby has drawn devoted coders worldwide.
Sam Ruby has a cool slideshow that outline the differences.
In the interest of bringing this information inline for easier reference, and in case the link goes dead in the abstract future, here's an overview of Sam's slides. The slideshow is less overwhelming to review, but having it all laid out in a list like this is also helpful.
Ruby 1.9
irb(main):001:0> ?c => "c"
Ruby 1.8.6
irb(main):001:0> ?c => 99
Ruby 1.9
irb(main):001:0> "cat"[1] => "a"
Ruby 1.8.6
irb(main):001:0> "cat"[1] => 97
Ruby 1.9
irb(main):002:0> {1,2} SyntaxError: (irb):2: syntax error, unexpected ',', expecting tASSOC
Ruby 1.8.6
irb(main):001:0> {1,2} => {1=>2}
Action: Convert to {1 => 2}
Array.to_s
Now Contains PunctuationRuby 1.9
irb(main):001:0> [1,2,3].to_s => "[1, 2, 3]"
Ruby 1.8.6
irb(main):001:0> [1,2,3].to_s => "123"
Action: Use .join instead
Ruby 1.9
irb(main):001:0> case 'a'; when /\w/: puts 'word'; end SyntaxError: (irb):1: syntax error, unexpected ':', expecting keyword_then or ',' or ';' or '\n'
Ruby 1.8.6
irb(main):001:0> case 'a'; when /\w/: puts 'word'; end word
Action: Use semicolon, then, or newline
Ruby 1.9
irb(main):001:0> i=0; [1,2,3].each {|i|}; i => 0 irb(main):002:0> i=0; for i in [1,2,3]; end; i => 3
Ruby 1.8.6
irb(main):001:0> i=0; [1,2,3].each {|i|}; i => 3
Hash.index
DeprecatedRuby 1.9
irb(main):001:0> {1=>2}.index(2) (irb):18: warning: Hash#index is deprecated; use Hash#key => 1 irb(main):002:0> {1=>2}.key(2) => 1
Ruby 1.8.6
irb(main):001:0> {1=>2}.index(2) => 1
Action: Use Hash.key
Fixnum.to_sym
Now GoneRuby 1.9
irb(main):001:0> 5.to_sym NoMethodError: undefined method 'to_sym' for 5:Fixnum
Ruby 1.8.6
irb(main):001:0> 5.to_sym => nil
(Cont'd) Ruby 1.9
# Find an argument value by name or index. def [](index) lookup(index.to_sym) end
svn.ruby-lang.org/repos/ruby/trunk/lib/rake.rb
Ruby 1.9
irb(main):001:0> {:a=>"a", :c=>"c", :b=>"b"} => {:a=>"a", :c=>"c", :b=>"b"}
Ruby 1.8.6
irb(main):001:0> {:a=>"a", :c=>"c", :b=>"b"} => {:a=>"a", :b=>"b", :c=>"c"}
Order is insertion order
Ruby 1.9
irb(main):001:0> /\x80/u SyntaxError: (irb):2: invalid multibyte escape: /\x80/
Ruby 1.8.6
irb(main):001:0> /\x80/u => /\x80/u
tr
and Regexp
Now Understand UnicodeRuby 1.9
unicode(string).tr(CP1252_DIFFERENCES, UNICODE_EQUIVALENT). gsub(INVALID_XML_CHAR, REPLACEMENT_CHAR). gsub(XML_PREDEFINED) {|c| PREDEFINED[c.ord]}
pack
and unpack
Ruby 1.8.6
def xchr(escape=true) n = XChar::CP1252[self] || self case n when *XChar::VALID XChar::PREDEFINED[n] or (n>128 ? n.chr : (escape ? "&##{n};" : [n].pack('U*'))) else Builder::XChar::REPLACEMENT_CHAR end end unpack('U*').map {|n| n.xchr(escape)}.join
BasicObject
More Brutal Than BlankSlate
Ruby 1.9
irb(main):001:0> class C < BasicObject; def f; Math::PI; end; end; C.new.f NameError: uninitialized constant C::Math
Ruby 1.8.6
irb(main):001:0> require 'blankslate' => true irb(main):002:0> class C < BlankSlate; def f; Math::PI; end; end; C.new.f => 3.14159265358979
Action: Use ::Math::PI
Ruby 1.9
irb(main):002:0> class C < SimpleDelegator; end => nil irb(main):003:0> C.new('').class => String
Ruby 1.8.6
irb(main):002:0> class C < SimpleDelegator; end => nil irb(main):003:0> C.new('').class => C irb(main):004:0>
Defect 17700
Ruby 1.9
irb(main):004:1> $KCODE = 'UTF8' (irb):4: warning: variable $KCODE is no longer effective; ignored => "UTF8"
Ruby 1.8.6
irb(main):001:0> $KCODE = 'UTF8' => "UTF8"
instance_methods
Now an Array of SymbolsRuby 1.9
irb(main):001:0> {}.methods.sort.last => :zip
Ruby 1.8.6
irb(main):001:0> {}.methods.sort.last => "zip"
Action: Replace instance_methods.include? with method_defined?
# coding: utf-8
# -*- encoding: utf-8 -*-
#!/usr/local/rubybook/bin/ruby # encoding: utf-8
Ruby 1.9
{a: b} redirect_to action: show
Ruby 1.8.6
{:a => b} redirect_to :action => show
Ruby 1.9
[1,2].each {|value; t| t=value*value}
Ruby 1.9
[1,2].inject(:+)
Ruby 1.8.6
[1,2].inject {|a,b| a+b}
to_enum
Ruby 1.9
short_enum = [1, 2, 3].to_enum long_enum = ('a'..'z').to_enum loop do puts "#{short_enum.next} #{long_enum.next}" end
Ruby 1.9
e = [1,2,3].each
Ruby 1.9
p = -> a,b,c {a+b+c} puts p.(1,2,3) puts p[1,2,3]
Ruby 1.8.6
p = lambda {|a,b,c| a+b+c} puts p.call(1,2,3)
Ruby 1.9
Complex(3,4) == 3 + 4.im
Ruby 1.9
irb(main):001:0> 1.2-1.1 => 0.0999999999999999
Ruby 1.9
/\p{Space}/
Ruby 1.8.6
/[:space:]/
Ruby 1.9
def foo(first, *middle, last) (->a, *b, c {p a-c}).(*5.downto(1))
Ruby 1.9
f = Fiber.new do a,b = 0,1 Fiber.yield a Fiber.yield b loop do a,b = b,a+b Fiber.yield b end end 10.times {puts f.resume}
Ruby 1.9
match = while line = gets next if line =~ /^#/ break line if line.find('ruby') end
Ruby 1.9
def toggle def toggle "subsequent times" end "first time" end
HTH!
One huge difference would be the move from Matz's interpreter to YARV, a bytecode virtual machine that helps significantly with performance.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With