SlideShare a Scribd company logo
Ruby
The programming language
that made Rails possible
The Oath
The Oath
“I do solemnly swear:
I will not consider this an exhaustive Ruby lesson
and I will study Ruby more as I progress in Rails,
so James will not come take my keyboard away!”
irb
The secret weapon of the Rubyists
The REPL
The REPL

Ruby comes with a Read-Eval-Print-Loop tool called irb
The REPL

Ruby comes with a Read-Eval-Print-Loop tool called irb
  In short, you feed it some Ruby and it prints results
The REPL

Ruby comes with a Read-Eval-Print-Loop tool called irb
  In short, you feed it some Ruby and it prints results
This is an excellent way to learn the language
The REPL

Ruby comes with a Read-Eval-Print-Loop tool called irb
  In short, you feed it some Ruby and it prints results
This is an excellent way to learn the language
  It becomes a powerful data management tool when
  used with Rails
The REPL

Ruby comes with a Read-Eval-Print-Loop tool called irb
  In short, you feed it some Ruby and it prints results
This is an excellent way to learn the language
  It becomes a powerful data management tool when
  used with Rails
Do yourself a favor and start playing with irb a lot
Using irb
Using irb

            $ irb
            >> 1 + 2
            => 3
            >> "james".capitalize
            => "James"
            >> %w[y b u R].reverse
            => ["R", "u", "b", "y"]
            >> _.join("-")
            => "R-u-b-y"
            >> exit
Using irb
 Run irb to launch it
                        $ irb
                        >> 1 + 2
                        => 3
                        >> "james".capitalize
                        => "James"
                        >> %w[y b u R].reverse
                        => ["R", "u", "b", "y"]
                        >> _.join("-")
                        => "R-u-b-y"
                        >> exit
Using irb
 Run irb to launch it
                        $ irb
 You enter Ruby         >> 1 + 2
 expressions            => 3
                        >> "james".capitalize
                        => "James"
                        >> %w[y b u R].reverse
                        => ["R", "u", "b", "y"]
                        >> _.join("-")
                        => "R-u-b-y"
                        >> exit
Using irb
 Run irb to launch it
                         $ irb
 You enter Ruby          >> 1 + 2
 expressions             => 3
                         >> "james".capitalize
                         => "James"
 irb responds with the   >> %w[y b u R].reverse
 results as you type     => ["R", "u", "b", "y"]
                         >> _.join("-")
                         => "R-u-b-y"
                         >> exit
Using irb
 Run irb to launch it
                           $ irb
 You enter Ruby            >> 1 + 2
 expressions               => 3
                           >> "james".capitalize
                           => "James"
 irb responds with the     >> %w[y b u R].reverse
 results as you type       => ["R", "u", "b", "y"]
                           >> _.join("-")
                           => "R-u-b-y"
 _ holds the last result   >> exit
Using irb
 Run irb to launch it
                           $ irb
 You enter Ruby            >> 1 + 2
 expressions               => 3
                           >> "james".capitalize
                           => "James"
 irb responds with the     >> %w[y b u R].reverse
 results as you type       => ["R", "u", "b", "y"]
                           >> _.join("-")
                           => "R-u-b-y"
 _ holds the last result   >> exit

 Use exit() to quit
Data Types
The building blocks of Ruby
Data Types and Structures
Data Types and Structures
Ruby has data types common to most programming
languages: String, Integer, Float, …
Data Types and Structures
Ruby has data types common to most programming
languages: String, Integer, Float, …
Ruby has two primary data structures: Array and Hash
Data Types and Structures
Ruby has data types common to most programming
languages: String, Integer, Float, …
Ruby has two primary data structures: Array and Hash
  These structures are very versatile and can serve as
  sets, queues, stacks, …
Data Types and Structures
Ruby has data types common to most programming
languages: String, Integer, Float, …
Ruby has two primary data structures: Array and Hash
  These structures are very versatile and can serve as
  sets, queues, stacks, …
Ruby has some other data types, like Time
Data Types and Structures
Ruby has data types common to most programming
languages: String, Integer, Float, …
Ruby has two primary data structures: Array and Hash
  These structures are very versatile and can serve as
  sets, queues, stacks, …
Ruby has some other data types, like Time
All of the above are full objects in Ruby
Ruby
String    “ta lot of escapesn#{1 + 2}”   ‘less ( or ’)’
                      255              0377
Integer
                      0xFF       0b11111111
                              0.00003
 Float
                               3.0e-5
               [“James”, “Edward”, “Gray”, “II”]
 Array
                  %w[James Edward Gray II]
 Hash        {“name” => “James”, “age” => 33}
Symbol                   :first_name
Regexp /AJ(?:ames )?E(?:dward )?G(?:ray )?(?:II|2)z/
                          Time.now
 Time
       Time.local(2010, 3, 10) Time.utc(2010, 3, 10)
String    “ta lot of escapesn#{1 + 2}”   ‘less ( or ’)’
                      255              0377
Integer
                      0xFF       0b11111111
                              0.00003
 Float
                               3.0e-5
               [“James”, “Edward”, “Gray”, “II”]
 Array
                  %w[James Edward Gray II]
 Hash        {“name” => “James”, “age” => 33}
Symbol                   :first_name
Regexp /AJ(?:ames )?E(?:dward )?G(?:ray )?(?:II|2)z/
                          Time.now
 Time
       Time.local(2010, 3, 10) Time.utc(2010, 3, 10)
String    “ta lot of escapesn#{1 + 2}”   ‘less ( or ’)’
                      255              0377
Integer
                      0xFF       0b11111111
                              0.00003
 Float
                               3.0e-5
               [“James”, “Edward”, “Gray”, “II”]
 Array
                  %w[James Edward Gray II]
 Hash        {“name” => “James”, “age” => 33}
Symbol                   :first_name
Regexp /AJ(?:ames )?E(?:dward )?G(?:ray )?(?:II|2)z/
                          Time.now
 Time
       Time.local(2010, 3, 10) Time.utc(2010, 3, 10)
String    “ta lot of escapesn#{1 + 2}”   ‘less ( or ’)’
                      255              0377
Integer
                      0xFF       0b11111111
                              0.00003
 Float
                               3.0e-5
               [“James”, “Edward”, “Gray”, “II”]
 Array
                  %w[James Edward Gray II]
 Hash        {“name” => “James”, “age” => 33}
Symbol                   :first_name
Regexp /AJ(?:ames )?E(?:dward )?G(?:ray )?(?:II|2)z/
                          Time.now
 Time
       Time.local(2010, 3, 10) Time.utc(2010, 3, 10)
String    “ta lot of escapesn#{1 + 2}”   ‘less ( or ’)’
                      255              0377
Integer
                      0xFF       0b11111111
                              0.00003
 Float
                               3.0e-5
               [“James”, “Edward”, “Gray”, “II”]
 Array
                  %w[James Edward Gray II]
 Hash        {“name” => “James”, “age” => 33}
Symbol                   :first_name
Regexp /AJ(?:ames )?E(?:dward )?G(?:ray )?(?:II|2)z/
                          Time.now
 Time
       Time.local(2010, 3, 10) Time.utc(2010, 3, 10)
String    “ta lot of escapesn#{1 + 2}”   ‘less ( or ’)’
                      255              0377
Integer
                      0xFF       0b11111111
                              0.00003
 Float
                               3.0e-5
               [“James”, “Edward”, “Gray”, “II”]
 Array
                  %w[James Edward Gray II]
 Hash        {“name” => “James”, “age” => 33}
Symbol                   :first_name
Regexp /AJ(?:ames )?E(?:dward )?G(?:ray )?(?:II|2)z/
                          Time.now
 Time
       Time.local(2010, 3, 10) Time.utc(2010, 3, 10)
String    “ta lot of escapesn#{1 + 2}”   ‘less ( or ’)’
                      255              0377
Integer
                      0xFF       0b11111111
                              0.00003
 Float
                               3.0e-5
               [“James”, “Edward”, “Gray”, “II”]
 Array
                  %w[James Edward Gray II]
 Hash        {“name” => “James”, “age” => 33}
Symbol                   :first_name
Regexp /AJ(?:ames )?E(?:dward )?G(?:ray )?(?:II|2)z/
                          Time.now
 Time
       Time.local(2010, 3, 10) Time.utc(2010, 3, 10)
String    “ta lot of escapesn#{1 + 2}”   ‘less ( or ’)’
                      255              0377
Integer
                      0xFF       0b11111111
                              0.00003
 Float
                               3.0e-5
               [“James”, “Edward”, “Gray”, “II”]
 Array
                  %w[James Edward Gray II]
 Hash        {“name” => “James”, “age” => 33}
Symbol                   :first_name
Regexp /AJ(?:ames )?E(?:dward )?G(?:ray )?(?:II|2)z/
                          Time.now
 Time
       Time.local(2010, 3, 10) Time.utc(2010, 3, 10)
Working With Strings
Working With Strings
               >>   space = "textra space n"
               =>   "textra space n"
               >>   space.strip
               =>   "extra space"
               >>   space.rstrip
               =>   "textra space"

               >> "James".delete("aeiou")
               => "Jms"

               >>   date = "March 2010"
               =>   "March 2010"
               >>   date[0..4]
               =>   "March"
               >>   date[-2..-1]
               =>   "10"
               >>   date[/d+/]
               =>   "2010"
Working With Strings
                   >>   space = "textra space n"
String provides:   =>
                   >>
                        "textra space n"
                        space.strip
                   =>   "extra space"
                   >>   space.rstrip
                   =>   "textra space"

                   >> "James".delete("aeiou")
                   => "Jms"

                   >>   date = "March 2010"
                   =>   "March 2010"
                   >>   date[0..4]
                   =>   "March"
                   >>   date[-2..-1]
                   =>   "10"
                   >>   date[/d+/]
                   =>   "2010"
Working With Strings
                   >>   space = "textra space n"
String provides:   =>
                   >>
                        "textra space n"
                        space.strip
                   =>   "extra space"
  Case changing    >>
                   =>
                        space.rstrip
                        "textra space"

                   >> "James".delete("aeiou")
                   => "Jms"

                   >>   date = "March 2010"
                   =>   "March 2010"
                   >>   date[0..4]
                   =>   "March"
                   >>   date[-2..-1]
                   =>   "10"
                   >>   date[/d+/]
                   =>   "2010"
Working With Strings
                         >>   space = "textra space n"
String provides:         =>
                         >>
                              "textra space n"
                              space.strip
                         =>   "extra space"
  Case changing          >>
                         =>
                              space.rstrip
                              "textra space"

  Whitespace stripping   >> "James".delete("aeiou")
                         => "Jms"

                         >>   date = "March 2010"
                         =>   "March 2010"
                         >>   date[0..4]
                         =>   "March"
                         >>   date[-2..-1]
                         =>   "10"
                         >>   date[/d+/]
                         =>   "2010"
Working With Strings
                         >>   space = "textra space n"
String provides:         =>
                         >>
                              "textra space n"
                              space.strip
                         =>   "extra space"
  Case changing          >>
                         =>
                              space.rstrip
                              "textra space"

  Whitespace stripping   >> "James".delete("aeiou")
                         => "Jms"

  General editing        >>
                         =>
                              date = "March 2010"
                              "March 2010"
                         >>   date[0..4]
                         =>   "March"
                         >>   date[-2..-1]
                         =>   "10"
                         >>   date[/d+/]
                         =>   "2010"
Working With Strings
                         >>   space = "textra space n"
String provides:         =>
                         >>
                              "textra space n"
                              space.strip
                         =>   "extra space"
  Case changing          >>
                         =>
                              space.rstrip
                              "textra space"

  Whitespace stripping   >> "James".delete("aeiou")
                         => "Jms"

  General editing        >>
                         =>
                              date = "March 2010"
                              "March 2010"
                         >>   date[0..4]
  Indexing               =>   "March"
                         >>   date[-2..-1]
                         =>   "10"
                         >>   date[/d+/]
                         =>   "2010"
Working With Strings
                         >>   space = "textra space n"
String provides:         =>
                         >>
                              "textra space n"
                              space.strip
                         =>   "extra space"
  Case changing          >>
                         =>
                              space.rstrip
                              "textra space"

  Whitespace stripping   >> "James".delete("aeiou")
                         => "Jms"

  General editing        >>
                         =>
                              date = "March 2010"
                              "March 2010"
                         >>   date[0..4]
  Indexing               =>   "March"
                         >>   date[-2..-1]
                         =>   "10"
  …                      >>   date[/d+/]
                         =>   "2010"
Working With Arrays
Working With Arrays
                >>   a = [0, 1]
                =>   [0, 1]
                >>   a << 2 << 3 << 4
                =>   [0, 1, 2, 3, 4]
                >>   a.pop
                =>   4
                >>   a
                =>   [0, 1, 2, 3]

                >>   a[1]
                =>   1
                >>   a[1..-1]
                =>   [1, 2, 3]

                >>   a & [0, 2, 4, 6]
                =>   [0, 2]
                >>   a | [42]
                =>   [0, 1, 2, 3, 42]
Working With Arrays
                  >>   a = [0, 1]
Array provides:   =>
                  >>
                       [0, 1]
                       a << 2 << 3 << 4
                  =>   [0, 1, 2, 3, 4]
                  >>   a.pop
                  =>   4
                  >>   a
                  =>   [0, 1, 2, 3]

                  >>   a[1]
                  =>   1
                  >>   a[1..-1]
                  =>   [1, 2, 3]

                  >>   a & [0, 2, 4, 6]
                  =>   [0, 2]
                  >>   a | [42]
                  =>   [0, 1, 2, 3, 42]
Working With Arrays
                    >>   a = [0, 1]
Array provides:     =>
                    >>
                         [0, 1]
                         a << 2 << 3 << 4
                    =>   [0, 1, 2, 3, 4]
  Adding elements   >>
                    =>
                         a.pop
                         4
                    >>   a
                    =>   [0, 1, 2, 3]

                    >>   a[1]
                    =>   1
                    >>   a[1..-1]
                    =>   [1, 2, 3]

                    >>   a & [0, 2, 4, 6]
                    =>   [0, 2]
                    >>   a | [42]
                    =>   [0, 1, 2, 3, 42]
Working With Arrays
                      >>   a = [0, 1]
Array provides:       =>
                      >>
                           [0, 1]
                           a << 2 << 3 << 4
                      =>   [0, 1, 2, 3, 4]
  Adding elements     >>
                      =>
                           a.pop
                           4
                      >>   a
  Removing elements   =>   [0, 1, 2, 3]

                      >>   a[1]
                      =>   1
                      >>   a[1..-1]
                      =>   [1, 2, 3]

                      >>   a & [0, 2, 4, 6]
                      =>   [0, 2]
                      >>   a | [42]
                      =>   [0, 1, 2, 3, 42]
Working With Arrays
                      >>   a = [0, 1]
Array provides:       =>
                      >>
                           [0, 1]
                           a << 2 << 3 << 4
                      =>   [0, 1, 2, 3, 4]
  Adding elements     >>
                      =>
                           a.pop
                           4
                      >>   a
  Removing elements   =>   [0, 1, 2, 3]

                      >>   a[1]
  Indexing            =>
                      >>
                           1
                           a[1..-1]
                      =>   [1, 2, 3]

                      >>   a & [0, 2, 4, 6]
                      =>   [0, 2]
                      >>   a | [42]
                      =>   [0, 1, 2, 3, 42]
Working With Arrays
                      >>   a = [0, 1]
Array provides:       =>
                      >>
                           [0, 1]
                           a << 2 << 3 << 4
                      =>   [0, 1, 2, 3, 4]
  Adding elements     >>
                      =>
                           a.pop
                           4
                      >>   a
  Removing elements   =>   [0, 1, 2, 3]

                      >>   a[1]
  Indexing            =>
                      >>
                           1
                           a[1..-1]
                      =>   [1, 2, 3]
  Set operations
                      >>   a & [0, 2, 4, 6]
                      =>   [0, 2]
                      >>   a | [42]
                      =>   [0, 1, 2, 3, 42]
Working With Arrays
                      >>   a = [0, 1]
Array provides:       =>
                      >>
                           [0, 1]
                           a << 2 << 3 << 4
                      =>   [0, 1, 2, 3, 4]
  Adding elements     >>
                      =>
                           a.pop
                           4
                      >>   a
  Removing elements   =>   [0, 1, 2, 3]

                      >>   a[1]
  Indexing            =>
                      >>
                           1
                           a[1..-1]
                      =>   [1, 2, 3]
  Set operations
                      >>   a & [0, 2, 4, 6]
                      =>   [0, 2]
  …                   >>   a | [42]
                      =>   [0, 1, 2, 3, 42]
Working With Hashes
Working With Hashes
               >>   h = {:a => 1, :b => 2}
               =>   {:a=>1, :b=>2}
               >>   h[:b]
               =>   2
               >>   h[:c] = 3
               =>   3
               >>   h
               =>   {:a=>1, :b=>2, :c=>3}

               >>   h.keys
               =>   [:a, :b, :c]
               >>   h.values
               =>   [1, 2, 3]

               >>   h.include? :c
               =>   true
               >>   h.include? :d
               =>   false
Working With Hashes
                 >>   h = {:a => 1, :b => 2}
Hash provides:   =>
                 >>
                      {:a=>1, :b=>2}
                      h[:b]
                 =>   2
                 >>   h[:c] = 3
                 =>   3
                 >>   h
                 =>   {:a=>1, :b=>2, :c=>3}

                 >>   h.keys
                 =>   [:a, :b, :c]
                 >>   h.values
                 =>   [1, 2, 3]

                 >>   h.include? :c
                 =>   true
                 >>   h.include? :d
                 =>   false
Working With Hashes
                      >>   h = {:a => 1, :b => 2}
Hash provides:        =>
                      >>
                           {:a=>1, :b=>2}
                           h[:b]
                      =>   2
  Key-value storage   >>
                      =>
                           h[:c] = 3
                           3
                      >>   h
                      =>   {:a=>1, :b=>2, :c=>3}

                      >>   h.keys
                      =>   [:a, :b, :c]
                      >>   h.values
                      =>   [1, 2, 3]

                      >>   h.include? :c
                      =>   true
                      >>   h.include? :d
                      =>   false
Working With Hashes
                         >>   h = {:a => 1, :b => 2}
Hash provides:           =>
                         >>
                              {:a=>1, :b=>2}
                              h[:b]
                         =>   2
  Key-value storage      >>
                         =>
                              h[:c] = 3
                              3
                         >>   h
  Key addition/removal   =>   {:a=>1, :b=>2, :c=>3}

                         >>   h.keys
                         =>   [:a, :b, :c]
                         >>   h.values
                         =>   [1, 2, 3]

                         >>   h.include? :c
                         =>   true
                         >>   h.include? :d
                         =>   false
Working With Hashes
                         >>   h = {:a => 1, :b => 2}
Hash provides:           =>
                         >>
                              {:a=>1, :b=>2}
                              h[:b]
                         =>   2
  Key-value storage      >>
                         =>
                              h[:c] = 3
                              3
                         >>   h
  Key addition/removal   =>   {:a=>1, :b=>2, :c=>3}

                         >>   h.keys
  Indexing               =>
                         >>
                              [:a, :b, :c]
                              h.values
                         =>   [1, 2, 3]

                         >>   h.include? :c
                         =>   true
                         >>   h.include? :d
                         =>   false
Working With Hashes
                         >>   h = {:a => 1, :b => 2}
Hash provides:           =>
                         >>
                              {:a=>1, :b=>2}
                              h[:b]
                         =>   2
  Key-value storage      >>
                         =>
                              h[:c] = 3
                              3
                         >>   h
  Key addition/removal   =>   {:a=>1, :b=>2, :c=>3}

                         >>   h.keys
  Indexing               =>
                         >>
                              [:a, :b, :c]
                              h.values
                         =>   [1, 2, 3]
  Queries
                         >>   h.include? :c
                         =>   true
                         >>   h.include? :d
                         =>   false
Working With Hashes
                         >>   h = {:a => 1, :b => 2}
Hash provides:           =>
                         >>
                              {:a=>1, :b=>2}
                              h[:b]
                         =>   2
  Key-value storage      >>
                         =>
                              h[:c] = 3
                              3
                         >>   h
  Key addition/removal   =>   {:a=>1, :b=>2, :c=>3}

                         >>   h.keys
  Indexing               =>
                         >>
                              [:a, :b, :c]
                              h.values
                         =>   [1, 2, 3]
  Queries
                         >>   h.include? :c
                         =>   true
  …                      >>   h.include? :d
                         =>   false
Type Conversions
Type Conversions
              >>   pi = "3.1415"
              =>   "3.1415"
              >>   pi.to_f
              =>   3.1415
              >>   pi.to_i
              =>   3

              >>   num = 42
              =>   42
              >>   num.to_s
              =>   "42"
              >>   num.to_s(16)
              =>   "2a"

              >>   animals = "chickens,cows,Rubyists"
              =>   "chickens,cows,Rubyists"
              >>   animals.split(",")
              =>   ["chickens", "cows", "Rubyists"]
              >>   animals.split(",", 2)
              =>   ["chickens", "cows,Rubyists"]
              >>   animals.split(",").join(" | ")
              =>   "chickens | cows | Rubyists"
Type Conversions
Ruby has many        >>   pi = "3.1415"
                     =>   "3.1415"
conversion methods   >>   pi.to_f
                     =>   3.1415
                     >>   pi.to_i
                     =>   3

                     >>   num = 42
                     =>   42
                     >>   num.to_s
                     =>   "42"
                     >>   num.to_s(16)
                     =>   "2a"

                     >>   animals = "chickens,cows,Rubyists"
                     =>   "chickens,cows,Rubyists"
                     >>   animals.split(",")
                     =>   ["chickens", "cows", "Rubyists"]
                     >>   animals.split(",", 2)
                     =>   ["chickens", "cows,Rubyists"]
                     >>   animals.split(",").join(" | ")
                     =>   "chickens | cows | Rubyists"
Type Conversions
Ruby has many          >>   pi = "3.1415"
                       =>   "3.1415"
conversion methods     >>   pi.to_f
                       =>   3.1415
                       >>   pi.to_i
  Strings can become   =>   3

  Integers or Floats   >>
                       =>
                            num = 42
                            42
                       >>   num.to_s
                       =>   "42"
                       >>   num.to_s(16)
                       =>   "2a"

                       >>   animals = "chickens,cows,Rubyists"
                       =>   "chickens,cows,Rubyists"
                       >>   animals.split(",")
                       =>   ["chickens", "cows", "Rubyists"]
                       >>   animals.split(",", 2)
                       =>   ["chickens", "cows,Rubyists"]
                       >>   animals.split(",").join(" | ")
                       =>   "chickens | cows | Rubyists"
Type Conversions
Ruby has many            >>   pi = "3.1415"
                         =>   "3.1415"
conversion methods       >>   pi.to_f
                         =>   3.1415
                         >>   pi.to_i
  Strings can become     =>   3

  Integers or Floats     >>
                         =>
                              num = 42
                              42
                         >>   num.to_s
                         =>   "42"
  Numbers can            >>   num.to_s(16)
                         =>   "2a"
  Stringified in a base   >>   animals = "chickens,cows,Rubyists"
                         =>   "chickens,cows,Rubyists"
                         >>   animals.split(",")
                         =>   ["chickens", "cows", "Rubyists"]
                         >>   animals.split(",", 2)
                         =>   ["chickens", "cows,Rubyists"]
                         >>   animals.split(",").join(" | ")
                         =>   "chickens | cows | Rubyists"
Type Conversions
Ruby has many            >>   pi = "3.1415"
                         =>   "3.1415"
conversion methods       >>   pi.to_f
                         =>   3.1415
                         >>   pi.to_i
  Strings can become     =>   3

  Integers or Floats     >>
                         =>
                              num = 42
                              42
                         >>   num.to_s
                         =>   "42"
  Numbers can            >>   num.to_s(16)
                         =>   "2a"
  Stringified in a base   >>   animals = "chickens,cows,Rubyists"
                         =>   "chickens,cows,Rubyists"
  Strings become         >>
                         =>
                              animals.split(",")
                              ["chickens", "cows", "Rubyists"]

  Arrays, and go back    >>
                         =>
                              animals.split(",", 2)
                              ["chickens", "cows,Rubyists"]
                         >>   animals.split(",").join(" | ")
                         =>   "chickens | cows | Rubyists"
Type Conversions
Ruby has many            >>   pi = "3.1415"
                         =>   "3.1415"
conversion methods       >>   pi.to_f
                         =>   3.1415
                         >>   pi.to_i
  Strings can become     =>   3

  Integers or Floats     >>
                         =>
                              num = 42
                              42
                         >>   num.to_s
                         =>   "42"
  Numbers can            >>   num.to_s(16)
                         =>   "2a"
  Stringified in a base   >>   animals = "chickens,cows,Rubyists"
                         =>   "chickens,cows,Rubyists"
  Strings become         >>
                         =>
                              animals.split(",")
                              ["chickens", "cows", "Rubyists"]

  Arrays, and go back    >>
                         =>
                              animals.split(",", 2)
                              ["chickens", "cows,Rubyists"]
                         >>   animals.split(",").join(" | ")
                         =>   "chickens | cows | Rubyists"
  …
Flow Control
Conditional logic
The if statement
The if statement

                   num = rand(10)
                   print "#{num}: "
                   if num == 7
                     puts "Lucky!"
                   elsif num <= 3
                     puts "A little low."
                   else
                     puts "A boring number."
                   end
                   # >> 2: A little low.
The if statement
 Ruby has if/elsif/else
 conditionals             num = rand(10)
                          print "#{num}: "
                          if num == 7
                            puts "Lucky!"
                          elsif num <= 3
                            puts "A little low."
                          else
                            puts "A boring number."
                          end
                          # >> 2: A little low.
The if statement
 Ruby has if/elsif/else
 conditionals             num = rand(10)
                          print "#{num}: "
 The code is run if the   if num == 7
                            puts "Lucky!"
 condition is true        elsif num <= 3
                            puts "A little low."
                          else
                            puts "A boring number."
                          end
                          # >> 2: A little low.
The if statement
 Ruby has if/elsif/else
 conditionals               num = rand(10)
                            print "#{num}: "
 The code is run if the     if num == 7
                              puts "Lucky!"
 condition is true          elsif num <= 3
                              puts "A little low."
 In Ruby, false and nil     else
                              puts "A boring number."
 are false and all other    end
                            # >> 2: A little low.
 objects are true (0, “”,
 etc.)
The if statement
 Ruby has if/elsif/else
 conditionals               num = rand(10)
                            print "#{num}: "
 The code is run if the     if num == 7
                              puts "Lucky!"
 condition is true          elsif num <= 3
                              puts "A little low."
 In Ruby, false and nil     else
                              puts "A boring number."
 are false and all other    end
                            # >> 2: A little low.
 objects are true (0, “”,
 etc.)
When Things go Wrong
When Things go Wrong


              >> 42 / 0
              ZeroDivisionError: divided by 0
               from (irb):1:in `/'
               from (irb):1
               from :0
When Things go Wrong
Ruby “raises” errors
(called Exceptions)
when things go wrong
                       >> 42 / 0
                       ZeroDivisionError: divided by 0
                        from (irb):1:in `/'
                        from (irb):1
                        from :0
When Things go Wrong
Ruby “raises” errors
(called Exceptions)
when things go wrong
Error objects have a   >> 42 / 0
                       ZeroDivisionError: divided by 0
type, message, and      from (irb):1:in `/'
                        from (irb):1
backtrace               from :0
When Things go Wrong
Ruby “raises” errors
(called Exceptions)
when things go wrong
Error objects have a   >> 42 / 0
                       ZeroDivisionError: divided by 0
type, message, and      from (irb):1:in `/'
                        from (irb):1
backtrace               from :0
When Things go Wrong
Ruby “raises” errors
(called Exceptions)
when things go wrong
Error objects have a   >> 42 / 0
                       ZeroDivisionError: divided by 0
type, message, and      from (irb):1:in `/'
                        from (irb):1
backtrace               from :0
When Things go Wrong
Ruby “raises” errors
(called Exceptions)
when things go wrong
Error objects have a       >> 42 / 0
                           ZeroDivisionError: divided by 0
type, message, and          from (irb):1:in `/'
                            from (irb):1
backtrace                   from :0


By default, processing
stops if the error isn’t
“rescued”
Exception Handling
Exception Handling


              >>   begin
              >>     n = 42 / 0
              >>   rescue ZeroDivisionError => error
              >>     n=0
              >>   end
              =>   0
              >>   n
              =>   0
Exception Handling

Put code that might
raise errors between   >>   begin
                       >>     n = 42 / 0
begin … end            >>
                       >>
                            rescue ZeroDivisionError => error
                              n=0
                       >>   end
                       =>   0
                       >>   n
                       =>   0
Exception Handling

Put code that might
raise errors between      >>   begin
                          >>     n = 42 / 0
begin … end               >>
                          >>
                               rescue ZeroDivisionError => error
                                 n=0
                          >>   end
Add rescue clauses        =>
                          >>
                               0
                               n

for the error types you   =>   0


want to handle
Objects and Methods
In Ruby, very nearly everything is an object
Everything is an Object
Everything is an Object


                >> -42.abs
                => 42
                >> 3.times { puts "Howdy" }
                Howdy
                Howdy
                Howdy
                => 3
Everything is an Object

 With a few very minor
 exceptions, everything   >> -42.abs
                          => 42
 in Ruby is an Object     >> 3.times { puts "Howdy" }
                          Howdy
                          Howdy
                          Howdy
                          => 3
Everything is an Object

 With a few very minor
 exceptions, everything     >> -42.abs
                            => 42
 in Ruby is an Object       >> 3.times { puts "Howdy" }
                            Howdy
                            Howdy
 Even a number literal is   Howdy
 an Object and you can      => 3

 call methods on it
Instance Variables
Private, per object storage
class Name
 def initialize(first = nil)
   self.first = first
 end

 def first=(first)
  @first = first
 end

 def first
  @first
 end
end




Instance Variables
Private, per object storage
class Name
 def initialize(first = nil)
   self.first = first
 end

 def first=(first)
  @first = first
 end

 def first
  @first
 end
end




Instance Variables
Private, per object storage
class Name
 def initialize(first = nil)
   self.first = first
 end

 def first=(first)
  @first = first
 end

 def first
  @first
 end
end




Instance Variables
Private, per object storage
class Name
 def initialize(first = nil)
   self.first = first
 end

 def first=(first)
  @first = first
 end

 def first
  @first
 end
end




Instance Variables
Private, per object storage
class Name
 def initialize(first = nil)
   self.first = first
 end

 def first=(first)
  @first = first
 end

 def first
  @first
 end
end




Instance Variables
Private, per object storage
class Name
 def initialize(first = nil)
   self.first = first
 end

 def first=(first)
  @first = first
 end

 def first
  @first
 end
end




Instance Variables
Private, per object storage
class Name
 def initialize(first = nil)
   self.first = first
 end                          dana     = Name.new("Dana")
                              james     = Name.new
 def first=(first)              james.first = "James"
  @first = first                puts dana.first
 end                          puts james.first
                              # >> Dana
 def first                     # >> James
  @first
 end
end




Instance Variables
Private, per object storage
class Name
 def initialize(first = nil)
   self.first = first
 end                          dana     = Name.new("Dana")
                              james     = Name.new
 def first=(first)              james.first = "James"
  @first = first                puts dana.first
 end                          puts james.first
                              # >> Dana
 def first                     # >> James
  @first
 end
end




Instance Variables
Private, per object storage
class Name
 def initialize(first = nil)
   self.first = first
 end                          dana     = Name.new("Dana")
                              james     = Name.new
 def first=(first)              james.first = "James"
  @first = first                puts dana.first
 end                          puts james.first
                              # >> Dana
 def first                     # >> James
  @first
 end
end




Instance Variables
Private, per object storage
class Name
 def initialize(first = nil)
   self.first = first
 end                          dana     = Name.new("Dana")
                              james     = Name.new
 def first=(first)              james.first = "James"
  @first = first                puts dana.first
 end                          puts james.first
                              # >> Dana
 def first                     # >> James
  @first
 end
end




Instance Variables
Private, per object storage
Single Inheritance
Single Inheritance
                class Parent
                 def greet
                   @greeting ||= "Hello!"
                 end
                end
                class Child < Parent
                 def initialize
                   @greeting = "Yo!"
                 end
                end
                puts Parent.new.greet
                puts Child.new.greet
                # >> Hello!
                # >> Yo!
Single Inheritance
 A Class can declare   class Parent
                        def greet
 one parent               @greeting ||= "Hello!"
                        end
                       end
                       class Child < Parent
                        def initialize
                          @greeting = "Yo!"
                        end
                       end
                       puts Parent.new.greet
                       puts Child.new.greet
                       # >> Hello!
                       # >> Yo!
Single Inheritance
 A Class can declare    class Parent
                         def greet
 one parent                @greeting ||= "Hello!"
                         end
 A child inherits all   end
                        class Child < Parent
 behavior from all       def initialize
                           @greeting = "Yo!"
 ancestors               end
                        end
                        puts Parent.new.greet
                        puts Child.new.greet
                        # >> Hello!
                        # >> Yo!
Single Inheritance
 A Class can declare      class Parent
                           def greet
 one parent                  @greeting ||= "Hello!"
                           end
 A child inherits all     end
                          class Child < Parent
 behavior from all         def initialize
                             @greeting = "Yo!"
 ancestors                 end
                          end
 Ruby’s Object is the     puts Parent.new.greet
                          puts Child.new.greet
 highest parent for all   # >> Hello!
 Classes                  # >> Yo!
Questions and
Dangerous Methods
Questions and
Dangerous Methods
                >>   0.zero?
                =>   true
                >>   0.0.zero?
                =>   true
                >>   0.00001.zero?
                =>   false

                >>   s = "string"
                =>   "string"
                >>   s.upcase
                =>   "STRING"
                >>   s
                =>   "string"
                >>   s.upcase!
                =>   "STRING"
                >>   s
                =>   "STRING"
Questions and
Dangerous Methods
Ruby has some   >>
                =>
                     0.zero?
                     true
method name     >>
                =>
                     0.0.zero?
                     true
conventions     >>
                =>
                     0.00001.zero?
                     false

                >>   s = "string"
                =>   "string"
                >>   s.upcase
                =>   "STRING"
                >>   s
                =>   "string"
                >>   s.upcase!
                =>   "STRING"
                >>   s
                =>   "STRING"
Questions and
Dangerous Methods
Ruby has some        >>
                     =>
                          0.zero?
                          true
method name          >>
                     =>
                          0.0.zero?
                          true
conventions          >>
                     =>
                          0.00001.zero?
                          false

Question methods     >>
                     =>
                          s = "string"
                          "string"
(answering true or   >>   s.upcase
                     =>   "STRING"
false) end in ?      >>   s
                     =>   "string"
                     >>   s.upcase!
                     =>   "STRING"
                     >>   s
                     =>   "STRING"
Questions and
Dangerous Methods
Ruby has some        >>
                     =>
                          0.zero?
                          true
method name          >>
                     =>
                          0.0.zero?
                          true
conventions          >>
                     =>
                          0.00001.zero?
                          false

Question methods     >>
                     =>
                          s = "string"
                          "string"
(answering true or   >>   s.upcase
                     =>   "STRING"
false) end in ?      >>   s
                     =>   "string"
                     >>   s.upcase!
Dangerous methods    =>   "STRING"
                     >>   s
end in !             =>   "STRING"
“Mixins”
A uniquely Ruby way to share methods
Modules
Modules
          module Netstring
           def to_netstring(*args)
            str = to_s(*args)
            "#{str.length}:#{str},"
           end
          end

          class String
           include Netstring
          end
          class Integer < Numeric
           include Netstring
          end

          p   "James".to_netstring
          p   42.to_netstring(2)
          #   >> "5:James,"
          #   >> "6:101010,"
Modules
                       module Netstring
                        def to_netstring(*args)
Ruby doesn’t have        str = to_s(*args)
                         "#{str.length}:#{str},"
multiple inheritance    end
                       end

                       class String
                        include Netstring
                       end
                       class Integer < Numeric
                        include Netstring
                       end

                       p   "James".to_netstring
                       p   42.to_netstring(2)
                       #   >> "5:James,"
                       #   >> "6:101010,"
Modules
                          module Netstring
                           def to_netstring(*args)
Ruby doesn’t have           str = to_s(*args)
                            "#{str.length}:#{str},"
multiple inheritance       end
                          end

Instead, we can “mix” a   class String
                           include Netstring
Module of methods         end
“in”to a Class            class Integer < Numeric
                           include Netstring
                          end

                          p   "James".to_netstring
                          p   42.to_netstring(2)
                          #   >> "5:James,"
                          #   >> "6:101010,"
Modules
                          module Netstring
                           def to_netstring(*args)
Ruby doesn’t have           str = to_s(*args)
                            "#{str.length}:#{str},"
multiple inheritance       end
                          end

Instead, we can “mix” a   class String
                           include Netstring
Module of methods         end
“in”to a Class            class Integer < Numeric
                           include Netstring
                          end
  We call these           p   "James".to_netstring
  Modules “mixins”        p
                          #
                              42.to_netstring(2)
                              >> "5:James,"
                          #   >> "6:101010,"
Modules
                          module Netstring
                           def to_netstring(*args)
Ruby doesn’t have           str = to_s(*args)
                            "#{str.length}:#{str},"
multiple inheritance       end
                          end

Instead, we can “mix” a   class String
                           include Netstring
Module of methods         end
“in”to a Class            class Integer < Numeric
                           include Netstring
                          end
  We call these           p   "James".to_netstring
  Modules “mixins”        p
                          #
                              42.to_netstring(2)
                              >> "5:James,"
                          #   >> "6:101010,"
Blocks and Iterators
Rubyists turn their noses up at loops
Blocks
Blocks

         def until_successful
          loop do
            break if yield == :success
          end
         end

         until_successful {
           puts "Called."
           :success if rand(3).zero?
         }
         # >> Called.
         # >> Called.
         # >> Called.
         # >> Called.
Blocks
In Ruby, you can pass    def until_successful
a block (some code) to    loop do
                            break if yield == :success
a called method           end
                         end

                         until_successful {
                           puts "Called."
                           :success if rand(3).zero?
                         }
                         # >> Called.
                         # >> Called.
                         # >> Called.
                         # >> Called.
Blocks
In Ruby, you can pass    def until_successful
a block (some code) to    loop do
                            break if yield == :success
a called method           end
                         end

  Block code is in       until_successful {
                           puts "Called."
  { … } or do … end        :success if rand(3).zero?
                         }
                         # >> Called.
                         # >> Called.
                         # >> Called.
                         # >> Called.
Blocks
In Ruby, you can pass    def until_successful
a block (some code) to    loop do
                            break if yield == :success
a called method           end
                         end

  Block code is in       until_successful {
                           puts "Called."
  { … } or do … end        :success if rand(3).zero?
                         }
That method can run      # >> Called.
                         # >> Called.
the passed code with     # >> Called.
                         # >> Called.
yield
Ruby
for (…; …; …) {

}
for (…; …; …) {

                }




Rubyists Don’t “Loop”
We “iterate” instead
The each() Iterator
The each() Iterator


                name = %w[James Edward Gray II]
                name.each do |word|
                 puts word.reverse
                end
                # >> semaJ
                # >> drawdE
                # >> yarG
                # >> II
The each() Iterator

 Let Ruby manage   name = %w[James Edward Gray II]
 indexes for you   name.each do |word|
                    puts word.reverse
                   end
                   # >> semaJ
                   # >> drawdE
                   # >> yarG
                   # >> II
The each() Iterator

 Let Ruby manage          name = %w[James Edward Gray II]
 indexes for you          name.each do |word|
                           puts word.reverse
                          end
 each() will call the     # >> semaJ
                          # >> drawdE
 block once with every    # >> yarG
                          # >> II
 item of the collection
The map() Iterator
The map() Iterator


                nums = *1..5
                p nums
                p nums.map { |n| n ** 2 }
                # >> [1, 2, 3, 4, 5]
                # >> [1, 4, 9, 16, 25]
The map() Iterator
 map() is used to
 transform your
 collection
                    nums = *1..5
                    p nums
                    p nums.map { |n| n ** 2 }
                    # >> [1, 2, 3, 4, 5]
                    # >> [1, 4, 9, 16, 25]
The map() Iterator
 map() is used to
 transform your
 collection
                           nums = *1..5
 Each item of the          p nums
                           p nums.map { |n| n ** 2 }
 collection is passed      # >> [1, 2, 3, 4, 5]
 into the block and the    # >> [1, 4, 9, 16, 25]

 result of the block
 replaces that item in a
 new collection
The map() Iterator
 map() is used to
 transform your
 collection
                           nums = *1..5
 Each item of the          p nums
                           p nums.map { |n| n ** 2 }
 collection is passed      # >> [1, 2, 3, 4, 5]
 into the block and the    # >> [1, 4, 9, 16, 25]

 result of the block
 replaces that item in a
 new collection
The select() Iterator
The select() Iterator


                 nums = *1..10
                 p nums
                 p nums.select { |n| n % 2 == 0 }
                 # >> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
                 # >> [2, 4, 6, 8, 10]
The select() Iterator

 select() can be used
 to filter a collection

                         nums = *1..10
                         p nums
                         p nums.select { |n| n % 2 == 0 }
                         # >> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
                         # >> [2, 4, 6, 8, 10]
The select() Iterator

 select() can be used
 to filter a collection
 Each item is passed         nums = *1..10

 into the block and if the   p nums
                             p nums.select { |n| n % 2 == 0 }
                             # >> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
 block conditional           # >> [2, 4, 6, 8, 10]

 evaluates to a true
 value the item is placed
 in the new collection
The select() Iterator

 select() can be used
 to filter a collection
 Each item is passed         nums = *1..10

 into the block and if the   p nums
                             p nums.select { |n| n % 2 == 0 }
                             # >> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
 block conditional           # >> [2, 4, 6, 8, 10]

 evaluates to a true
 value the item is placed
 in the new collection
And Much, Much More!
I have barely scratched the surface of Ruby
Ruby is a Rich Language
Ruby is a Rich Language
Over 140 methods on String and over 70 on Array
Ruby is a Rich Language
Over 140 methods on String and over 70 on Array
Automatic “big math” conversions
Ruby is a Rich Language
Over 140 methods on String and over 70 on Array
Automatic “big math” conversions
A very capable case statement (multi-branch conditional)
Ruby is a Rich Language
Over 140 methods on String and over 70 on Array
Automatic “big math” conversions
A very capable case statement (multi-branch conditional)
Custom per object behaviors
Ruby is a Rich Language
Over 140 methods on String and over 70 on Array
Automatic “big math” conversions
A very capable case statement (multi-branch conditional)
Custom per object behaviors
Over 30 iterators
Ruby is a Rich Language
Over 140 methods on String and over 70 on Array
Automatic “big math” conversions
A very capable case statement (multi-branch conditional)
Custom per object behaviors
Over 30 iterators
Powerful reflection capabilities
Questions?
Learning Ruby
from Ruby Lab
Your book has instructions on how to use irb to
learn more about Ruby from the language itself

More Related Content

What's hot (20)

PDF
The Ring programming language version 1.10 book - Part 47 of 212
Mahmoud Samir Fayed
 
PDF
The Ring programming language version 1.4 book - Part 8 of 30
Mahmoud Samir Fayed
 
PDF
Programming Lisp Clojure - 2장 : 클로저 둘러보기
JangHyuk You
 
KEY
CS442 - Rogue: A Scala DSL for MongoDB
jorgeortiz85
 
PDF
RxSwift 시작하기
Suyeol Jeon
 
PDF
Functional pe(a)rls: Huey's zipper
osfameron
 
PDF
여자개발자모임터 6주년 개발 세미나 - Scala Language
Ashal aka JOKER
 
PDF
λ | Lenses
Open-IT
 
PDF
Swift - 혼자 공부하면 분명히 안할테니까 같이 공부하기
Suyeol Jeon
 
ODP
Patterns for slick database applications
Skills Matter
 
PDF
Mary Had a Little λ (QCon)
Stephen Chin
 
PDF
The Ring programming language version 1.5.2 book - Part 29 of 181
Mahmoud Samir Fayed
 
PDF
Beyond Scala Lens
Julien Truffaut
 
PDF
7li7w devcon5
Kerry Buckley
 
PDF
Gareth hayes. non alphanumeric javascript-php and shared fuzzing
Yury Chemerkin
 
PDF
ハイブリッド言語Scalaを使う
bpstudy
 
PDF
PHP and MySQL Tips and tricks, DC 2007
Damien Seguy
 
PPTX
Scala best practices
Alexander Zaidel
 
PDF
FunScript 2013 (with speakers notes)
Zach Bray
 
PDF
Using Scala Slick at FortyTwo
Eishay Smith
 
The Ring programming language version 1.10 book - Part 47 of 212
Mahmoud Samir Fayed
 
The Ring programming language version 1.4 book - Part 8 of 30
Mahmoud Samir Fayed
 
Programming Lisp Clojure - 2장 : 클로저 둘러보기
JangHyuk You
 
CS442 - Rogue: A Scala DSL for MongoDB
jorgeortiz85
 
RxSwift 시작하기
Suyeol Jeon
 
Functional pe(a)rls: Huey's zipper
osfameron
 
여자개발자모임터 6주년 개발 세미나 - Scala Language
Ashal aka JOKER
 
λ | Lenses
Open-IT
 
Swift - 혼자 공부하면 분명히 안할테니까 같이 공부하기
Suyeol Jeon
 
Patterns for slick database applications
Skills Matter
 
Mary Had a Little λ (QCon)
Stephen Chin
 
The Ring programming language version 1.5.2 book - Part 29 of 181
Mahmoud Samir Fayed
 
Beyond Scala Lens
Julien Truffaut
 
7li7w devcon5
Kerry Buckley
 
Gareth hayes. non alphanumeric javascript-php and shared fuzzing
Yury Chemerkin
 
ハイブリッド言語Scalaを使う
bpstudy
 
PHP and MySQL Tips and tricks, DC 2007
Damien Seguy
 
Scala best practices
Alexander Zaidel
 
FunScript 2013 (with speakers notes)
Zach Bray
 
Using Scala Slick at FortyTwo
Eishay Smith
 

Viewers also liked (6)

PDF
comScore Inc. - 2013 Mobile Future in Focus
Sunny Kr
 
PPT
Amis Presentation
Esther Petrilli-Massey
 
PPTX
Harper College Scholars Prez
Maria Thompson
 
PPT
Covenant eyes app for android
rwpike
 
PDF
The Battle of Trafalgar
Yasmeen Od
 
PPT
Microsoft Access
UNIVERSIDAD CENTRAL DEL ECUADOR
 
comScore Inc. - 2013 Mobile Future in Focus
Sunny Kr
 
Amis Presentation
Esther Petrilli-Massey
 
Harper College Scholars Prez
Maria Thompson
 
Covenant eyes app for android
rwpike
 
The Battle of Trafalgar
Yasmeen Od
 
Ad

Similar to Ruby (10)

PDF
And now you have two problems. Ruby regular expressions for fun and profit by...
Codemotion
 
PDF
Useful javascript
Lei Kang
 
PDF
Ruby 程式語言入門導覽
Wen-Tien Chang
 
PPTX
Introducing Elixir
Abdulsattar Mohammed
 
PDF
Elm introduction
Mix & Go
 
PDF
On Functional Programming - A Clojurian Perspective
looselytyped
 
PDF
Ruby 1.9
guestaef7ea
 
KEY
An introduction to Ruby
Wes Oldenbeuving
 
PDF
What I learned from Seven Languages in Seven Weeks (IPRUG)
Kerry Buckley
 
PDF
The Magic Of Elixir
Gabriele Lana
 
And now you have two problems. Ruby regular expressions for fun and profit by...
Codemotion
 
Useful javascript
Lei Kang
 
Ruby 程式語言入門導覽
Wen-Tien Chang
 
Introducing Elixir
Abdulsattar Mohammed
 
Elm introduction
Mix & Go
 
On Functional Programming - A Clojurian Perspective
looselytyped
 
Ruby 1.9
guestaef7ea
 
An introduction to Ruby
Wes Oldenbeuving
 
What I learned from Seven Languages in Seven Weeks (IPRUG)
Kerry Buckley
 
The Magic Of Elixir
Gabriele Lana
 
Ad

More from James Gray (18)

KEY
A Dickens of A Keynote
James Gray
 
KEY
I Doubt That!
James Gray
 
KEY
Regular expressions
James Gray
 
KEY
Counting on God
James Gray
 
KEY
In the Back of Your Mind
James Gray
 
PDF
Unblocked
James Gray
 
KEY
Module Magic
James Gray
 
KEY
API Design
James Gray
 
KEY
Amazon's Simple Storage Service (S3)
James Gray
 
KEY
Git and GitHub
James Gray
 
KEY
Test Coverage in Rails
James Gray
 
KEY
Rails Routing And Rendering
James Gray
 
KEY
Sending Email with Rails
James Gray
 
KEY
Associations in Rails
James Gray
 
KEY
DRYing Up Rails Views and Controllers
James Gray
 
KEY
Building a Rails Interface
James Gray
 
KEY
Rails Model Basics
James Gray
 
KEY
Wed Development on Rails
James Gray
 
A Dickens of A Keynote
James Gray
 
I Doubt That!
James Gray
 
Regular expressions
James Gray
 
Counting on God
James Gray
 
In the Back of Your Mind
James Gray
 
Unblocked
James Gray
 
Module Magic
James Gray
 
API Design
James Gray
 
Amazon's Simple Storage Service (S3)
James Gray
 
Git and GitHub
James Gray
 
Test Coverage in Rails
James Gray
 
Rails Routing And Rendering
James Gray
 
Sending Email with Rails
James Gray
 
Associations in Rails
James Gray
 
DRYing Up Rails Views and Controllers
James Gray
 
Building a Rails Interface
James Gray
 
Rails Model Basics
James Gray
 
Wed Development on Rails
James Gray
 

Recently uploaded (20)

PPTX
Simplifying End-to-End Apache CloudStack Deployment with a Web-Based Automati...
ShapeBlue
 
PDF
Building Resilience with Digital Twins : Lessons from Korea
SANGHEE SHIN
 
PDF
Novus-Safe Pro: Brochure-What is Novus Safe Pro?.pdf
Novus Hi-Tech
 
PDF
Trading Volume Explained by CIFDAQ- Secret Of Market Trends
CIFDAQ
 
PDF
Bitcoin+ Escalando sin concesiones - Parte 1
Fernando Paredes García
 
PDF
2025-07-15 EMEA Volledig Inzicht Dutch Webinar
ThousandEyes
 
PDF
The Past, Present & Future of Kenya's Digital Transformation
Moses Kemibaro
 
PDF
Productivity Management Software | Workstatus
Lovely Baghel
 
PDF
Julia Furst Morgado The Lazy Guide to Kubernetes with EKS Auto Mode + Karpenter
AWS Chicago
 
PDF
HR agent at Mediq: Lessons learned on Agent Builder & Maestro by Tacstone Tec...
UiPathCommunity
 
PDF
TrustArc Webinar - Data Privacy Trends 2025: Mid-Year Insights & Program Stra...
TrustArc
 
PPTX
Building and Operating a Private Cloud with CloudStack and LINBIT CloudStack ...
ShapeBlue
 
PDF
How Current Advanced Cyber Threats Transform Business Operation
Eryk Budi Pratama
 
PPTX
The Yotta x CloudStack Advantage: Scalable, India-First Cloud
ShapeBlue
 
PPTX
Earn Agentblazer Status with Slack Community Patna.pptx
SanjeetMishra29
 
PPTX
Building a Production-Ready Barts Health Secure Data Environment Tooling, Acc...
Barts Health
 
PDF
Upskill to Agentic Automation 2025 - Kickoff Meeting
DianaGray10
 
PDF
NewMind AI Journal - Weekly Chronicles - July'25 Week II
NewMind AI
 
PDF
Rethinking Security Operations - Modern SOC.pdf
Haris Chughtai
 
PDF
CIFDAQ Market Insight for 14th July 2025
CIFDAQ
 
Simplifying End-to-End Apache CloudStack Deployment with a Web-Based Automati...
ShapeBlue
 
Building Resilience with Digital Twins : Lessons from Korea
SANGHEE SHIN
 
Novus-Safe Pro: Brochure-What is Novus Safe Pro?.pdf
Novus Hi-Tech
 
Trading Volume Explained by CIFDAQ- Secret Of Market Trends
CIFDAQ
 
Bitcoin+ Escalando sin concesiones - Parte 1
Fernando Paredes García
 
2025-07-15 EMEA Volledig Inzicht Dutch Webinar
ThousandEyes
 
The Past, Present & Future of Kenya's Digital Transformation
Moses Kemibaro
 
Productivity Management Software | Workstatus
Lovely Baghel
 
Julia Furst Morgado The Lazy Guide to Kubernetes with EKS Auto Mode + Karpenter
AWS Chicago
 
HR agent at Mediq: Lessons learned on Agent Builder & Maestro by Tacstone Tec...
UiPathCommunity
 
TrustArc Webinar - Data Privacy Trends 2025: Mid-Year Insights & Program Stra...
TrustArc
 
Building and Operating a Private Cloud with CloudStack and LINBIT CloudStack ...
ShapeBlue
 
How Current Advanced Cyber Threats Transform Business Operation
Eryk Budi Pratama
 
The Yotta x CloudStack Advantage: Scalable, India-First Cloud
ShapeBlue
 
Earn Agentblazer Status with Slack Community Patna.pptx
SanjeetMishra29
 
Building a Production-Ready Barts Health Secure Data Environment Tooling, Acc...
Barts Health
 
Upskill to Agentic Automation 2025 - Kickoff Meeting
DianaGray10
 
NewMind AI Journal - Weekly Chronicles - July'25 Week II
NewMind AI
 
Rethinking Security Operations - Modern SOC.pdf
Haris Chughtai
 
CIFDAQ Market Insight for 14th July 2025
CIFDAQ
 

Ruby

  • 3. The Oath “I do solemnly swear: I will not consider this an exhaustive Ruby lesson and I will study Ruby more as I progress in Rails, so James will not come take my keyboard away!”
  • 4. irb The secret weapon of the Rubyists
  • 6. The REPL Ruby comes with a Read-Eval-Print-Loop tool called irb
  • 7. The REPL Ruby comes with a Read-Eval-Print-Loop tool called irb In short, you feed it some Ruby and it prints results
  • 8. The REPL Ruby comes with a Read-Eval-Print-Loop tool called irb In short, you feed it some Ruby and it prints results This is an excellent way to learn the language
  • 9. The REPL Ruby comes with a Read-Eval-Print-Loop tool called irb In short, you feed it some Ruby and it prints results This is an excellent way to learn the language It becomes a powerful data management tool when used with Rails
  • 10. The REPL Ruby comes with a Read-Eval-Print-Loop tool called irb In short, you feed it some Ruby and it prints results This is an excellent way to learn the language It becomes a powerful data management tool when used with Rails Do yourself a favor and start playing with irb a lot
  • 12. Using irb $ irb >> 1 + 2 => 3 >> "james".capitalize => "James" >> %w[y b u R].reverse => ["R", "u", "b", "y"] >> _.join("-") => "R-u-b-y" >> exit
  • 13. Using irb Run irb to launch it $ irb >> 1 + 2 => 3 >> "james".capitalize => "James" >> %w[y b u R].reverse => ["R", "u", "b", "y"] >> _.join("-") => "R-u-b-y" >> exit
  • 14. Using irb Run irb to launch it $ irb You enter Ruby >> 1 + 2 expressions => 3 >> "james".capitalize => "James" >> %w[y b u R].reverse => ["R", "u", "b", "y"] >> _.join("-") => "R-u-b-y" >> exit
  • 15. Using irb Run irb to launch it $ irb You enter Ruby >> 1 + 2 expressions => 3 >> "james".capitalize => "James" irb responds with the >> %w[y b u R].reverse results as you type => ["R", "u", "b", "y"] >> _.join("-") => "R-u-b-y" >> exit
  • 16. Using irb Run irb to launch it $ irb You enter Ruby >> 1 + 2 expressions => 3 >> "james".capitalize => "James" irb responds with the >> %w[y b u R].reverse results as you type => ["R", "u", "b", "y"] >> _.join("-") => "R-u-b-y" _ holds the last result >> exit
  • 17. Using irb Run irb to launch it $ irb You enter Ruby >> 1 + 2 expressions => 3 >> "james".capitalize => "James" irb responds with the >> %w[y b u R].reverse results as you type => ["R", "u", "b", "y"] >> _.join("-") => "R-u-b-y" _ holds the last result >> exit Use exit() to quit
  • 18. Data Types The building blocks of Ruby
  • 19. Data Types and Structures
  • 20. Data Types and Structures Ruby has data types common to most programming languages: String, Integer, Float, …
  • 21. Data Types and Structures Ruby has data types common to most programming languages: String, Integer, Float, … Ruby has two primary data structures: Array and Hash
  • 22. Data Types and Structures Ruby has data types common to most programming languages: String, Integer, Float, … Ruby has two primary data structures: Array and Hash These structures are very versatile and can serve as sets, queues, stacks, …
  • 23. Data Types and Structures Ruby has data types common to most programming languages: String, Integer, Float, … Ruby has two primary data structures: Array and Hash These structures are very versatile and can serve as sets, queues, stacks, … Ruby has some other data types, like Time
  • 24. Data Types and Structures Ruby has data types common to most programming languages: String, Integer, Float, … Ruby has two primary data structures: Array and Hash These structures are very versatile and can serve as sets, queues, stacks, … Ruby has some other data types, like Time All of the above are full objects in Ruby
  • 26. String “ta lot of escapesn#{1 + 2}” ‘less ( or ’)’ 255 0377 Integer 0xFF 0b11111111 0.00003 Float 3.0e-5 [“James”, “Edward”, “Gray”, “II”] Array %w[James Edward Gray II] Hash {“name” => “James”, “age” => 33} Symbol :first_name Regexp /AJ(?:ames )?E(?:dward )?G(?:ray )?(?:II|2)z/ Time.now Time Time.local(2010, 3, 10) Time.utc(2010, 3, 10)
  • 27. String “ta lot of escapesn#{1 + 2}” ‘less ( or ’)’ 255 0377 Integer 0xFF 0b11111111 0.00003 Float 3.0e-5 [“James”, “Edward”, “Gray”, “II”] Array %w[James Edward Gray II] Hash {“name” => “James”, “age” => 33} Symbol :first_name Regexp /AJ(?:ames )?E(?:dward )?G(?:ray )?(?:II|2)z/ Time.now Time Time.local(2010, 3, 10) Time.utc(2010, 3, 10)
  • 28. String “ta lot of escapesn#{1 + 2}” ‘less ( or ’)’ 255 0377 Integer 0xFF 0b11111111 0.00003 Float 3.0e-5 [“James”, “Edward”, “Gray”, “II”] Array %w[James Edward Gray II] Hash {“name” => “James”, “age” => 33} Symbol :first_name Regexp /AJ(?:ames )?E(?:dward )?G(?:ray )?(?:II|2)z/ Time.now Time Time.local(2010, 3, 10) Time.utc(2010, 3, 10)
  • 29. String “ta lot of escapesn#{1 + 2}” ‘less ( or ’)’ 255 0377 Integer 0xFF 0b11111111 0.00003 Float 3.0e-5 [“James”, “Edward”, “Gray”, “II”] Array %w[James Edward Gray II] Hash {“name” => “James”, “age” => 33} Symbol :first_name Regexp /AJ(?:ames )?E(?:dward )?G(?:ray )?(?:II|2)z/ Time.now Time Time.local(2010, 3, 10) Time.utc(2010, 3, 10)
  • 30. String “ta lot of escapesn#{1 + 2}” ‘less ( or ’)’ 255 0377 Integer 0xFF 0b11111111 0.00003 Float 3.0e-5 [“James”, “Edward”, “Gray”, “II”] Array %w[James Edward Gray II] Hash {“name” => “James”, “age” => 33} Symbol :first_name Regexp /AJ(?:ames )?E(?:dward )?G(?:ray )?(?:II|2)z/ Time.now Time Time.local(2010, 3, 10) Time.utc(2010, 3, 10)
  • 31. String “ta lot of escapesn#{1 + 2}” ‘less ( or ’)’ 255 0377 Integer 0xFF 0b11111111 0.00003 Float 3.0e-5 [“James”, “Edward”, “Gray”, “II”] Array %w[James Edward Gray II] Hash {“name” => “James”, “age” => 33} Symbol :first_name Regexp /AJ(?:ames )?E(?:dward )?G(?:ray )?(?:II|2)z/ Time.now Time Time.local(2010, 3, 10) Time.utc(2010, 3, 10)
  • 32. String “ta lot of escapesn#{1 + 2}” ‘less ( or ’)’ 255 0377 Integer 0xFF 0b11111111 0.00003 Float 3.0e-5 [“James”, “Edward”, “Gray”, “II”] Array %w[James Edward Gray II] Hash {“name” => “James”, “age” => 33} Symbol :first_name Regexp /AJ(?:ames )?E(?:dward )?G(?:ray )?(?:II|2)z/ Time.now Time Time.local(2010, 3, 10) Time.utc(2010, 3, 10)
  • 33. String “ta lot of escapesn#{1 + 2}” ‘less ( or ’)’ 255 0377 Integer 0xFF 0b11111111 0.00003 Float 3.0e-5 [“James”, “Edward”, “Gray”, “II”] Array %w[James Edward Gray II] Hash {“name” => “James”, “age” => 33} Symbol :first_name Regexp /AJ(?:ames )?E(?:dward )?G(?:ray )?(?:II|2)z/ Time.now Time Time.local(2010, 3, 10) Time.utc(2010, 3, 10)
  • 35. Working With Strings >> space = "textra space n" => "textra space n" >> space.strip => "extra space" >> space.rstrip => "textra space" >> "James".delete("aeiou") => "Jms" >> date = "March 2010" => "March 2010" >> date[0..4] => "March" >> date[-2..-1] => "10" >> date[/d+/] => "2010"
  • 36. Working With Strings >> space = "textra space n" String provides: => >> "textra space n" space.strip => "extra space" >> space.rstrip => "textra space" >> "James".delete("aeiou") => "Jms" >> date = "March 2010" => "March 2010" >> date[0..4] => "March" >> date[-2..-1] => "10" >> date[/d+/] => "2010"
  • 37. Working With Strings >> space = "textra space n" String provides: => >> "textra space n" space.strip => "extra space" Case changing >> => space.rstrip "textra space" >> "James".delete("aeiou") => "Jms" >> date = "March 2010" => "March 2010" >> date[0..4] => "March" >> date[-2..-1] => "10" >> date[/d+/] => "2010"
  • 38. Working With Strings >> space = "textra space n" String provides: => >> "textra space n" space.strip => "extra space" Case changing >> => space.rstrip "textra space" Whitespace stripping >> "James".delete("aeiou") => "Jms" >> date = "March 2010" => "March 2010" >> date[0..4] => "March" >> date[-2..-1] => "10" >> date[/d+/] => "2010"
  • 39. Working With Strings >> space = "textra space n" String provides: => >> "textra space n" space.strip => "extra space" Case changing >> => space.rstrip "textra space" Whitespace stripping >> "James".delete("aeiou") => "Jms" General editing >> => date = "March 2010" "March 2010" >> date[0..4] => "March" >> date[-2..-1] => "10" >> date[/d+/] => "2010"
  • 40. Working With Strings >> space = "textra space n" String provides: => >> "textra space n" space.strip => "extra space" Case changing >> => space.rstrip "textra space" Whitespace stripping >> "James".delete("aeiou") => "Jms" General editing >> => date = "March 2010" "March 2010" >> date[0..4] Indexing => "March" >> date[-2..-1] => "10" >> date[/d+/] => "2010"
  • 41. Working With Strings >> space = "textra space n" String provides: => >> "textra space n" space.strip => "extra space" Case changing >> => space.rstrip "textra space" Whitespace stripping >> "James".delete("aeiou") => "Jms" General editing >> => date = "March 2010" "March 2010" >> date[0..4] Indexing => "March" >> date[-2..-1] => "10" … >> date[/d+/] => "2010"
  • 43. Working With Arrays >> a = [0, 1] => [0, 1] >> a << 2 << 3 << 4 => [0, 1, 2, 3, 4] >> a.pop => 4 >> a => [0, 1, 2, 3] >> a[1] => 1 >> a[1..-1] => [1, 2, 3] >> a & [0, 2, 4, 6] => [0, 2] >> a | [42] => [0, 1, 2, 3, 42]
  • 44. Working With Arrays >> a = [0, 1] Array provides: => >> [0, 1] a << 2 << 3 << 4 => [0, 1, 2, 3, 4] >> a.pop => 4 >> a => [0, 1, 2, 3] >> a[1] => 1 >> a[1..-1] => [1, 2, 3] >> a & [0, 2, 4, 6] => [0, 2] >> a | [42] => [0, 1, 2, 3, 42]
  • 45. Working With Arrays >> a = [0, 1] Array provides: => >> [0, 1] a << 2 << 3 << 4 => [0, 1, 2, 3, 4] Adding elements >> => a.pop 4 >> a => [0, 1, 2, 3] >> a[1] => 1 >> a[1..-1] => [1, 2, 3] >> a & [0, 2, 4, 6] => [0, 2] >> a | [42] => [0, 1, 2, 3, 42]
  • 46. Working With Arrays >> a = [0, 1] Array provides: => >> [0, 1] a << 2 << 3 << 4 => [0, 1, 2, 3, 4] Adding elements >> => a.pop 4 >> a Removing elements => [0, 1, 2, 3] >> a[1] => 1 >> a[1..-1] => [1, 2, 3] >> a & [0, 2, 4, 6] => [0, 2] >> a | [42] => [0, 1, 2, 3, 42]
  • 47. Working With Arrays >> a = [0, 1] Array provides: => >> [0, 1] a << 2 << 3 << 4 => [0, 1, 2, 3, 4] Adding elements >> => a.pop 4 >> a Removing elements => [0, 1, 2, 3] >> a[1] Indexing => >> 1 a[1..-1] => [1, 2, 3] >> a & [0, 2, 4, 6] => [0, 2] >> a | [42] => [0, 1, 2, 3, 42]
  • 48. Working With Arrays >> a = [0, 1] Array provides: => >> [0, 1] a << 2 << 3 << 4 => [0, 1, 2, 3, 4] Adding elements >> => a.pop 4 >> a Removing elements => [0, 1, 2, 3] >> a[1] Indexing => >> 1 a[1..-1] => [1, 2, 3] Set operations >> a & [0, 2, 4, 6] => [0, 2] >> a | [42] => [0, 1, 2, 3, 42]
  • 49. Working With Arrays >> a = [0, 1] Array provides: => >> [0, 1] a << 2 << 3 << 4 => [0, 1, 2, 3, 4] Adding elements >> => a.pop 4 >> a Removing elements => [0, 1, 2, 3] >> a[1] Indexing => >> 1 a[1..-1] => [1, 2, 3] Set operations >> a & [0, 2, 4, 6] => [0, 2] … >> a | [42] => [0, 1, 2, 3, 42]
  • 51. Working With Hashes >> h = {:a => 1, :b => 2} => {:a=>1, :b=>2} >> h[:b] => 2 >> h[:c] = 3 => 3 >> h => {:a=>1, :b=>2, :c=>3} >> h.keys => [:a, :b, :c] >> h.values => [1, 2, 3] >> h.include? :c => true >> h.include? :d => false
  • 52. Working With Hashes >> h = {:a => 1, :b => 2} Hash provides: => >> {:a=>1, :b=>2} h[:b] => 2 >> h[:c] = 3 => 3 >> h => {:a=>1, :b=>2, :c=>3} >> h.keys => [:a, :b, :c] >> h.values => [1, 2, 3] >> h.include? :c => true >> h.include? :d => false
  • 53. Working With Hashes >> h = {:a => 1, :b => 2} Hash provides: => >> {:a=>1, :b=>2} h[:b] => 2 Key-value storage >> => h[:c] = 3 3 >> h => {:a=>1, :b=>2, :c=>3} >> h.keys => [:a, :b, :c] >> h.values => [1, 2, 3] >> h.include? :c => true >> h.include? :d => false
  • 54. Working With Hashes >> h = {:a => 1, :b => 2} Hash provides: => >> {:a=>1, :b=>2} h[:b] => 2 Key-value storage >> => h[:c] = 3 3 >> h Key addition/removal => {:a=>1, :b=>2, :c=>3} >> h.keys => [:a, :b, :c] >> h.values => [1, 2, 3] >> h.include? :c => true >> h.include? :d => false
  • 55. Working With Hashes >> h = {:a => 1, :b => 2} Hash provides: => >> {:a=>1, :b=>2} h[:b] => 2 Key-value storage >> => h[:c] = 3 3 >> h Key addition/removal => {:a=>1, :b=>2, :c=>3} >> h.keys Indexing => >> [:a, :b, :c] h.values => [1, 2, 3] >> h.include? :c => true >> h.include? :d => false
  • 56. Working With Hashes >> h = {:a => 1, :b => 2} Hash provides: => >> {:a=>1, :b=>2} h[:b] => 2 Key-value storage >> => h[:c] = 3 3 >> h Key addition/removal => {:a=>1, :b=>2, :c=>3} >> h.keys Indexing => >> [:a, :b, :c] h.values => [1, 2, 3] Queries >> h.include? :c => true >> h.include? :d => false
  • 57. Working With Hashes >> h = {:a => 1, :b => 2} Hash provides: => >> {:a=>1, :b=>2} h[:b] => 2 Key-value storage >> => h[:c] = 3 3 >> h Key addition/removal => {:a=>1, :b=>2, :c=>3} >> h.keys Indexing => >> [:a, :b, :c] h.values => [1, 2, 3] Queries >> h.include? :c => true … >> h.include? :d => false
  • 59. Type Conversions >> pi = "3.1415" => "3.1415" >> pi.to_f => 3.1415 >> pi.to_i => 3 >> num = 42 => 42 >> num.to_s => "42" >> num.to_s(16) => "2a" >> animals = "chickens,cows,Rubyists" => "chickens,cows,Rubyists" >> animals.split(",") => ["chickens", "cows", "Rubyists"] >> animals.split(",", 2) => ["chickens", "cows,Rubyists"] >> animals.split(",").join(" | ") => "chickens | cows | Rubyists"
  • 60. Type Conversions Ruby has many >> pi = "3.1415" => "3.1415" conversion methods >> pi.to_f => 3.1415 >> pi.to_i => 3 >> num = 42 => 42 >> num.to_s => "42" >> num.to_s(16) => "2a" >> animals = "chickens,cows,Rubyists" => "chickens,cows,Rubyists" >> animals.split(",") => ["chickens", "cows", "Rubyists"] >> animals.split(",", 2) => ["chickens", "cows,Rubyists"] >> animals.split(",").join(" | ") => "chickens | cows | Rubyists"
  • 61. Type Conversions Ruby has many >> pi = "3.1415" => "3.1415" conversion methods >> pi.to_f => 3.1415 >> pi.to_i Strings can become => 3 Integers or Floats >> => num = 42 42 >> num.to_s => "42" >> num.to_s(16) => "2a" >> animals = "chickens,cows,Rubyists" => "chickens,cows,Rubyists" >> animals.split(",") => ["chickens", "cows", "Rubyists"] >> animals.split(",", 2) => ["chickens", "cows,Rubyists"] >> animals.split(",").join(" | ") => "chickens | cows | Rubyists"
  • 62. Type Conversions Ruby has many >> pi = "3.1415" => "3.1415" conversion methods >> pi.to_f => 3.1415 >> pi.to_i Strings can become => 3 Integers or Floats >> => num = 42 42 >> num.to_s => "42" Numbers can >> num.to_s(16) => "2a" Stringified in a base >> animals = "chickens,cows,Rubyists" => "chickens,cows,Rubyists" >> animals.split(",") => ["chickens", "cows", "Rubyists"] >> animals.split(",", 2) => ["chickens", "cows,Rubyists"] >> animals.split(",").join(" | ") => "chickens | cows | Rubyists"
  • 63. Type Conversions Ruby has many >> pi = "3.1415" => "3.1415" conversion methods >> pi.to_f => 3.1415 >> pi.to_i Strings can become => 3 Integers or Floats >> => num = 42 42 >> num.to_s => "42" Numbers can >> num.to_s(16) => "2a" Stringified in a base >> animals = "chickens,cows,Rubyists" => "chickens,cows,Rubyists" Strings become >> => animals.split(",") ["chickens", "cows", "Rubyists"] Arrays, and go back >> => animals.split(",", 2) ["chickens", "cows,Rubyists"] >> animals.split(",").join(" | ") => "chickens | cows | Rubyists"
  • 64. Type Conversions Ruby has many >> pi = "3.1415" => "3.1415" conversion methods >> pi.to_f => 3.1415 >> pi.to_i Strings can become => 3 Integers or Floats >> => num = 42 42 >> num.to_s => "42" Numbers can >> num.to_s(16) => "2a" Stringified in a base >> animals = "chickens,cows,Rubyists" => "chickens,cows,Rubyists" Strings become >> => animals.split(",") ["chickens", "cows", "Rubyists"] Arrays, and go back >> => animals.split(",", 2) ["chickens", "cows,Rubyists"] >> animals.split(",").join(" | ") => "chickens | cows | Rubyists" …
  • 67. The if statement num = rand(10) print "#{num}: " if num == 7 puts "Lucky!" elsif num <= 3 puts "A little low." else puts "A boring number." end # >> 2: A little low.
  • 68. The if statement Ruby has if/elsif/else conditionals num = rand(10) print "#{num}: " if num == 7 puts "Lucky!" elsif num <= 3 puts "A little low." else puts "A boring number." end # >> 2: A little low.
  • 69. The if statement Ruby has if/elsif/else conditionals num = rand(10) print "#{num}: " The code is run if the if num == 7 puts "Lucky!" condition is true elsif num <= 3 puts "A little low." else puts "A boring number." end # >> 2: A little low.
  • 70. The if statement Ruby has if/elsif/else conditionals num = rand(10) print "#{num}: " The code is run if the if num == 7 puts "Lucky!" condition is true elsif num <= 3 puts "A little low." In Ruby, false and nil else puts "A boring number." are false and all other end # >> 2: A little low. objects are true (0, “”, etc.)
  • 71. The if statement Ruby has if/elsif/else conditionals num = rand(10) print "#{num}: " The code is run if the if num == 7 puts "Lucky!" condition is true elsif num <= 3 puts "A little low." In Ruby, false and nil else puts "A boring number." are false and all other end # >> 2: A little low. objects are true (0, “”, etc.)
  • 72. When Things go Wrong
  • 73. When Things go Wrong >> 42 / 0 ZeroDivisionError: divided by 0 from (irb):1:in `/' from (irb):1 from :0
  • 74. When Things go Wrong Ruby “raises” errors (called Exceptions) when things go wrong >> 42 / 0 ZeroDivisionError: divided by 0 from (irb):1:in `/' from (irb):1 from :0
  • 75. When Things go Wrong Ruby “raises” errors (called Exceptions) when things go wrong Error objects have a >> 42 / 0 ZeroDivisionError: divided by 0 type, message, and from (irb):1:in `/' from (irb):1 backtrace from :0
  • 76. When Things go Wrong Ruby “raises” errors (called Exceptions) when things go wrong Error objects have a >> 42 / 0 ZeroDivisionError: divided by 0 type, message, and from (irb):1:in `/' from (irb):1 backtrace from :0
  • 77. When Things go Wrong Ruby “raises” errors (called Exceptions) when things go wrong Error objects have a >> 42 / 0 ZeroDivisionError: divided by 0 type, message, and from (irb):1:in `/' from (irb):1 backtrace from :0
  • 78. When Things go Wrong Ruby “raises” errors (called Exceptions) when things go wrong Error objects have a >> 42 / 0 ZeroDivisionError: divided by 0 type, message, and from (irb):1:in `/' from (irb):1 backtrace from :0 By default, processing stops if the error isn’t “rescued”
  • 80. Exception Handling >> begin >> n = 42 / 0 >> rescue ZeroDivisionError => error >> n=0 >> end => 0 >> n => 0
  • 81. Exception Handling Put code that might raise errors between >> begin >> n = 42 / 0 begin … end >> >> rescue ZeroDivisionError => error n=0 >> end => 0 >> n => 0
  • 82. Exception Handling Put code that might raise errors between >> begin >> n = 42 / 0 begin … end >> >> rescue ZeroDivisionError => error n=0 >> end Add rescue clauses => >> 0 n for the error types you => 0 want to handle
  • 83. Objects and Methods In Ruby, very nearly everything is an object
  • 85. Everything is an Object >> -42.abs => 42 >> 3.times { puts "Howdy" } Howdy Howdy Howdy => 3
  • 86. Everything is an Object With a few very minor exceptions, everything >> -42.abs => 42 in Ruby is an Object >> 3.times { puts "Howdy" } Howdy Howdy Howdy => 3
  • 87. Everything is an Object With a few very minor exceptions, everything >> -42.abs => 42 in Ruby is an Object >> 3.times { puts "Howdy" } Howdy Howdy Even a number literal is Howdy an Object and you can => 3 call methods on it
  • 89. class Name def initialize(first = nil) self.first = first end def first=(first) @first = first end def first @first end end Instance Variables Private, per object storage
  • 90. class Name def initialize(first = nil) self.first = first end def first=(first) @first = first end def first @first end end Instance Variables Private, per object storage
  • 91. class Name def initialize(first = nil) self.first = first end def first=(first) @first = first end def first @first end end Instance Variables Private, per object storage
  • 92. class Name def initialize(first = nil) self.first = first end def first=(first) @first = first end def first @first end end Instance Variables Private, per object storage
  • 93. class Name def initialize(first = nil) self.first = first end def first=(first) @first = first end def first @first end end Instance Variables Private, per object storage
  • 94. class Name def initialize(first = nil) self.first = first end def first=(first) @first = first end def first @first end end Instance Variables Private, per object storage
  • 95. class Name def initialize(first = nil) self.first = first end dana = Name.new("Dana") james = Name.new def first=(first) james.first = "James" @first = first puts dana.first end puts james.first # >> Dana def first # >> James @first end end Instance Variables Private, per object storage
  • 96. class Name def initialize(first = nil) self.first = first end dana = Name.new("Dana") james = Name.new def first=(first) james.first = "James" @first = first puts dana.first end puts james.first # >> Dana def first # >> James @first end end Instance Variables Private, per object storage
  • 97. class Name def initialize(first = nil) self.first = first end dana = Name.new("Dana") james = Name.new def first=(first) james.first = "James" @first = first puts dana.first end puts james.first # >> Dana def first # >> James @first end end Instance Variables Private, per object storage
  • 98. class Name def initialize(first = nil) self.first = first end dana = Name.new("Dana") james = Name.new def first=(first) james.first = "James" @first = first puts dana.first end puts james.first # >> Dana def first # >> James @first end end Instance Variables Private, per object storage
  • 100. Single Inheritance class Parent def greet @greeting ||= "Hello!" end end class Child < Parent def initialize @greeting = "Yo!" end end puts Parent.new.greet puts Child.new.greet # >> Hello! # >> Yo!
  • 101. Single Inheritance A Class can declare class Parent def greet one parent @greeting ||= "Hello!" end end class Child < Parent def initialize @greeting = "Yo!" end end puts Parent.new.greet puts Child.new.greet # >> Hello! # >> Yo!
  • 102. Single Inheritance A Class can declare class Parent def greet one parent @greeting ||= "Hello!" end A child inherits all end class Child < Parent behavior from all def initialize @greeting = "Yo!" ancestors end end puts Parent.new.greet puts Child.new.greet # >> Hello! # >> Yo!
  • 103. Single Inheritance A Class can declare class Parent def greet one parent @greeting ||= "Hello!" end A child inherits all end class Child < Parent behavior from all def initialize @greeting = "Yo!" ancestors end end Ruby’s Object is the puts Parent.new.greet puts Child.new.greet highest parent for all # >> Hello! Classes # >> Yo!
  • 105. Questions and Dangerous Methods >> 0.zero? => true >> 0.0.zero? => true >> 0.00001.zero? => false >> s = "string" => "string" >> s.upcase => "STRING" >> s => "string" >> s.upcase! => "STRING" >> s => "STRING"
  • 106. Questions and Dangerous Methods Ruby has some >> => 0.zero? true method name >> => 0.0.zero? true conventions >> => 0.00001.zero? false >> s = "string" => "string" >> s.upcase => "STRING" >> s => "string" >> s.upcase! => "STRING" >> s => "STRING"
  • 107. Questions and Dangerous Methods Ruby has some >> => 0.zero? true method name >> => 0.0.zero? true conventions >> => 0.00001.zero? false Question methods >> => s = "string" "string" (answering true or >> s.upcase => "STRING" false) end in ? >> s => "string" >> s.upcase! => "STRING" >> s => "STRING"
  • 108. Questions and Dangerous Methods Ruby has some >> => 0.zero? true method name >> => 0.0.zero? true conventions >> => 0.00001.zero? false Question methods >> => s = "string" "string" (answering true or >> s.upcase => "STRING" false) end in ? >> s => "string" >> s.upcase! Dangerous methods => "STRING" >> s end in ! => "STRING"
  • 109. “Mixins” A uniquely Ruby way to share methods
  • 111. Modules module Netstring def to_netstring(*args) str = to_s(*args) "#{str.length}:#{str}," end end class String include Netstring end class Integer < Numeric include Netstring end p "James".to_netstring p 42.to_netstring(2) # >> "5:James," # >> "6:101010,"
  • 112. Modules module Netstring def to_netstring(*args) Ruby doesn’t have str = to_s(*args) "#{str.length}:#{str}," multiple inheritance end end class String include Netstring end class Integer < Numeric include Netstring end p "James".to_netstring p 42.to_netstring(2) # >> "5:James," # >> "6:101010,"
  • 113. Modules module Netstring def to_netstring(*args) Ruby doesn’t have str = to_s(*args) "#{str.length}:#{str}," multiple inheritance end end Instead, we can “mix” a class String include Netstring Module of methods end “in”to a Class class Integer < Numeric include Netstring end p "James".to_netstring p 42.to_netstring(2) # >> "5:James," # >> "6:101010,"
  • 114. Modules module Netstring def to_netstring(*args) Ruby doesn’t have str = to_s(*args) "#{str.length}:#{str}," multiple inheritance end end Instead, we can “mix” a class String include Netstring Module of methods end “in”to a Class class Integer < Numeric include Netstring end We call these p "James".to_netstring Modules “mixins” p # 42.to_netstring(2) >> "5:James," # >> "6:101010,"
  • 115. Modules module Netstring def to_netstring(*args) Ruby doesn’t have str = to_s(*args) "#{str.length}:#{str}," multiple inheritance end end Instead, we can “mix” a class String include Netstring Module of methods end “in”to a Class class Integer < Numeric include Netstring end We call these p "James".to_netstring Modules “mixins” p # 42.to_netstring(2) >> "5:James," # >> "6:101010,"
  • 116. Blocks and Iterators Rubyists turn their noses up at loops
  • 117. Blocks
  • 118. Blocks def until_successful loop do break if yield == :success end end until_successful { puts "Called." :success if rand(3).zero? } # >> Called. # >> Called. # >> Called. # >> Called.
  • 119. Blocks In Ruby, you can pass def until_successful a block (some code) to loop do break if yield == :success a called method end end until_successful { puts "Called." :success if rand(3).zero? } # >> Called. # >> Called. # >> Called. # >> Called.
  • 120. Blocks In Ruby, you can pass def until_successful a block (some code) to loop do break if yield == :success a called method end end Block code is in until_successful { puts "Called." { … } or do … end :success if rand(3).zero? } # >> Called. # >> Called. # >> Called. # >> Called.
  • 121. Blocks In Ruby, you can pass def until_successful a block (some code) to loop do break if yield == :success a called method end end Block code is in until_successful { puts "Called." { … } or do … end :success if rand(3).zero? } That method can run # >> Called. # >> Called. the passed code with # >> Called. # >> Called. yield
  • 123. for (…; …; …) { }
  • 124. for (…; …; …) { } Rubyists Don’t “Loop” We “iterate” instead
  • 126. The each() Iterator name = %w[James Edward Gray II] name.each do |word| puts word.reverse end # >> semaJ # >> drawdE # >> yarG # >> II
  • 127. The each() Iterator Let Ruby manage name = %w[James Edward Gray II] indexes for you name.each do |word| puts word.reverse end # >> semaJ # >> drawdE # >> yarG # >> II
  • 128. The each() Iterator Let Ruby manage name = %w[James Edward Gray II] indexes for you name.each do |word| puts word.reverse end each() will call the # >> semaJ # >> drawdE block once with every # >> yarG # >> II item of the collection
  • 130. The map() Iterator nums = *1..5 p nums p nums.map { |n| n ** 2 } # >> [1, 2, 3, 4, 5] # >> [1, 4, 9, 16, 25]
  • 131. The map() Iterator map() is used to transform your collection nums = *1..5 p nums p nums.map { |n| n ** 2 } # >> [1, 2, 3, 4, 5] # >> [1, 4, 9, 16, 25]
  • 132. The map() Iterator map() is used to transform your collection nums = *1..5 Each item of the p nums p nums.map { |n| n ** 2 } collection is passed # >> [1, 2, 3, 4, 5] into the block and the # >> [1, 4, 9, 16, 25] result of the block replaces that item in a new collection
  • 133. The map() Iterator map() is used to transform your collection nums = *1..5 Each item of the p nums p nums.map { |n| n ** 2 } collection is passed # >> [1, 2, 3, 4, 5] into the block and the # >> [1, 4, 9, 16, 25] result of the block replaces that item in a new collection
  • 135. The select() Iterator nums = *1..10 p nums p nums.select { |n| n % 2 == 0 } # >> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # >> [2, 4, 6, 8, 10]
  • 136. The select() Iterator select() can be used to filter a collection nums = *1..10 p nums p nums.select { |n| n % 2 == 0 } # >> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # >> [2, 4, 6, 8, 10]
  • 137. The select() Iterator select() can be used to filter a collection Each item is passed nums = *1..10 into the block and if the p nums p nums.select { |n| n % 2 == 0 } # >> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] block conditional # >> [2, 4, 6, 8, 10] evaluates to a true value the item is placed in the new collection
  • 138. The select() Iterator select() can be used to filter a collection Each item is passed nums = *1..10 into the block and if the p nums p nums.select { |n| n % 2 == 0 } # >> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] block conditional # >> [2, 4, 6, 8, 10] evaluates to a true value the item is placed in the new collection
  • 139. And Much, Much More! I have barely scratched the surface of Ruby
  • 140. Ruby is a Rich Language
  • 141. Ruby is a Rich Language Over 140 methods on String and over 70 on Array
  • 142. Ruby is a Rich Language Over 140 methods on String and over 70 on Array Automatic “big math” conversions
  • 143. Ruby is a Rich Language Over 140 methods on String and over 70 on Array Automatic “big math” conversions A very capable case statement (multi-branch conditional)
  • 144. Ruby is a Rich Language Over 140 methods on String and over 70 on Array Automatic “big math” conversions A very capable case statement (multi-branch conditional) Custom per object behaviors
  • 145. Ruby is a Rich Language Over 140 methods on String and over 70 on Array Automatic “big math” conversions A very capable case statement (multi-branch conditional) Custom per object behaviors Over 30 iterators
  • 146. Ruby is a Rich Language Over 140 methods on String and over 70 on Array Automatic “big math” conversions A very capable case statement (multi-branch conditional) Custom per object behaviors Over 30 iterators Powerful reflection capabilities
  • 148. Learning Ruby from Ruby Lab Your book has instructions on how to use irb to learn more about Ruby from the language itself