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_enumRuby 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