Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Getting Started with Ruby

Getting Started with Ruby

Some quick tips to getting started with Ruby. Presented at Motorola Solutions' APPFORUM Americas 2012 in Schaumburg, IL.

Daniel Morrison

June 06, 2012
Tweet

More Decks by Daniel Morrison

Other Decks in Programming

Transcript

  1. WELCOME Daniel Morrison • @danielmorrison • Founder, Collective Idea •

    Based in Holland, Michigan • Programmer • Ruby & Rails Instructor
  2. RUBY Language • Dynamic • Object-Oriented • Designed for Programmer

    Productivity Ruby on Rails • Web Framework • Launched Ruby into the public eye • Inspiration for many other frameworks RhoMobile • Uses Ruby to bridge devices • Rhodes framework takes cues from Rails
  3. DATA TYPES Numbers • Integer types: • 5.class #=> Fixnum

    • 9999999999999999999.class # => Bignum
  4. DATA TYPES Numbers • Integer types: • 5.class #=> Fixnum

    • 9999999999999999999.class # => Bignum Arithmetic Operation • + add • - subtract • * multiply • / divide • % modulus • ** exponent
  5. STRINGS Strings in ruby • “Hello World” • Can use

    single or double quoted. • As well as more esoteric syntaxes: %q|Hello World|
  6. STRINGS Strings in ruby • “Hello World” • Can use

    single or double quoted. • As well as more esoteric syntaxes: %q|Hello World| String Interpolation • “There are #{24 * 7} hours in a week.” • Only works with double quotes.
  7. METHODS Methods in ruby • Called Functions in other languages

    Define and call • def my_addition(value1, value2) value1 + value2 end • my_add(10, 5) # => 15
  8. VARIABLES Define a variable • a = “Hello World” •

    No need to specify type • Can redefine at any time • a = 15
  9. VARIABLES Define a variable • a = “Hello World” •

    No need to specify type • Can redefine at any time • a = 15 Strong Dynamic Typing • Strong: variable always has an explicit type • Dynamic: type can change at any time
  10. VARIABLES Define a variable • a = “Hello World” •

    No need to specify type • Can redefine at any time • a = 15 Strong Dynamic Typing • Strong: variable always has an explicit type • Dynamic: type can change at any time Duck Typing • def my_addition(value1, value2) value1 + value2 end • my_addition(“Hello”, “World”) # => “HelloWorld”
  11. ARRAY Easy to create • a = [5, 10, 45,

    9] • a = Array.new(5, 10, 45, 9) # works, but not usually used.
  12. ARRAY Easy to create • a = [5, 10, 45,

    9] • a = Array.new(5, 10, 45, 9) # works, but not usually used. Easy to access & modify • a[2] # => 45 • a[0] = 1000 # => [1000, 10, 45, 9]
  13. ARRAY Easy to create • a = [5, 10, 45,

    9] • a = Array.new(5, 10, 45, 9) # works, but not usually used. Easy to access & modify • a[2] # => 45 • a[0] = 1000 # => [1000, 10, 45, 9] Polyglot • b = [“banana”, 3.14, -200, “Hello World”] • Mix & match values
  14. ARRAY Easy to create • a = [5, 10, 45,

    9] • a = Array.new(5, 10, 45, 9) # works, but not usually used. Easy to access & modify • a[2] # => 45 • a[0] = 1000 # => [1000, 10, 45, 9] Polyglot • b = [“banana”, 3.14, -200, “Hello World”] • Mix & match values Dynamically Sized • fruits = [“Apple”, “Banana”] • fruits[2] = “Orange” # => [“Apple”, “Banana”, “Orange] • fruits.length # => 3
  15. HASH Key-Value Store • AKA: HashTable, Dictionary, associative array •

    Key is unique Easy to Create • h = {“name” => “Daniel”, “language” => “Ruby”}
  16. HASH Key-Value Store • AKA: HashTable, Dictionary, associative array •

    Key is unique Easy to Create • h = {“name” => “Daniel”, “language” => “Ruby”} Easy to Access • Array-like syntax • h[“name”] # => “Daniel” • h[“age”] # => nil • h[“age”] = 10 # => {“name” => “Daniel”, “age => 10, “language” => “Ruby”}
  17. HASH Key-Value Store • AKA: HashTable, Dictionary, associative array •

    Key is unique Easy to Create • h = {“name” => “Daniel”, “language” => “Ruby”} Easy to Access • Array-like syntax • h[“name”] # => “Daniel” • h[“age”] # => nil • h[“age”] = 10 # => {“name” => “Daniel”, “age => 10, “language” => “Ruby”} Symbols • Begin with a colon • Most often used as hash keys • h = {:name => “Alice”, :age => 10} • h[:age] # => 10 • h[“age”] # => nil
  18. NESTING Both Hash & Array can contain each other •

    apple = {“name” => “Apple”, “colors” => [“red”, “green”]} • banana = {“name” => “Banana”, “colors” => [“yellow”]} • fruits = [apple, banana] • fruits.last # => {“name” => “Banana”, “colors” => [“yellow”]}
  19. NESTING Both Hash & Array can contain each other •

    apple = {“name” => “Apple”, “colors” => [“red”, “green”]} • banana = {“name” => “Banana”, “colors” => [“yellow”]} • fruits = [apple, banana] • fruits.last # => {“name” => “Banana”, “colors” => [“yellow”]} Multidimensional Arrays • matrix = [[3, 2, 6], [1, 4, 5], [7, 4, 7]] • matrix[0] # => [3, 2, 6]
  20. RANGE Ranges of values • r = (10..100) • r.include?(20)

    # => true • r.include?(2) # => false
  21. RANGE Ranges of values • r = (10..100) • r.include?(20)

    # => true • r.include?(2) # => false Useful with Dates & Times • jan1 = Date.new(2012, 1, 1) • dec31 = Date.new(2012, 1, 1) • (jan1..dec31).include?(Date.today) # => true • (jan1..dec31).include?(Date.today + 365) # => false
  22. REGULAR EXPRESSIONS Easy to Create • r = Regexp.new(“\d\d\d\d-\d\d-\d\d”) •

    r = /\d\d\d\d-\d\d-\d\d/ Match Strings • info = “Conference runs from 2012-06-04 to 2012-06-06” • Use =~ to find match location • info =~ /\d\d\d\d-\d\d-\d\d/ # => 21 • Use match to get the data back • info.match(/\d\d\d\d-\d\d-\d\d/) # => #<MatchData "2012-06-04">
  23. REGULAR EXPRESSIONS Easy to Create • r = Regexp.new(“\d\d\d\d-\d\d-\d\d”) •

    r = /\d\d\d\d-\d\d-\d\d/ Match Strings • info = “Conference runs from 2012-06-04 to 2012-06-06” • Use =~ to find match location • info =~ /\d\d\d\d-\d\d-\d\d/ # => 21 • Use match to get the data back • info.match(/\d\d\d\d-\d\d-\d\d/) # => #<MatchData "2012-06-04"> Substitutions • info.sub(/\d\d\d\d-\d\d-\d\d/, “today”) - #=> “Conference runs from today to 2012-06-06” • info.gsub(/\d\d\d\d-\d\d-\d\d/, “today”) - #=> “Conference runs from today to today”
  24. IF STATEMENTS if • if input == “quit” exit end

    Single line if • exit if input == “quit”
  25. IF STATEMENTS if • if input == “quit” exit end

    Single line if • exit if input == “quit” unless • unless input == “quit” do_work end • do_work unless input == “quit”
  26. ELSE Test multiple conditions • if input == “quit” exit

    elsif input == “pause” sleep 20 else do_work end
  27. ELSE Test multiple conditions • if input == “quit” exit

    elsif input == “pause” sleep 20 else do_work end • Note the spelling of elsif
  28. CASE Ruby’s powerful case statement • case input when “quit”

    exit when “pause” sleep 20 when String puts “The input is #{input}” when 5..10 puts “The input was between 5 and 10” when /\d\d\d\d-\d\d-\d\d/ puts “The input looks like a date” else puts “I don’t understand you.” end
  29. WHILE Simple while loop • count = 0 • while

    count < 10 • puts count • count += 1 • end
  30. WHILE Simple while loop • count = 0 • while

    count < 10 • puts count • count += 1 • end += • Equivalent to count = count + 1 • Can be used with any number • And all basic math operations (*=, -=, etc.)
  31. WHILE Simple while loop • count = 0 • while

    count < 10 • puts count • count += 1 • end += • Equivalent to count = count + 1 • Can be used with any number • And all basic math operations (*=, -=, etc.) Inline while • count = 0 • puts count += 1 while count < 10
  32. UNLESS Unless is the inverted while • count = 0

    • unless count >= 10 • puts count • count += 1 • end
  33. UNTIL until is the inverted while • count = 0

    • until count >= 10 • puts count • count += 1 • end Inline until • count = 0 • puts count += 1 until count >= 10
  34. FOR For exists in Ruby • for fruit in fruits

    • puts “I love #{fruit} • end
  35. FOR For exists in Ruby • for fruit in fruits

    • puts “I love #{fruit} • end But we don’t use it.
  36. EACH Use each for iterating • fruits.each do |fruit| •

    puts “I love #{fruit}” • end Use do & end for multi-line, {} for single-line • fruits.each {|fruit| puts “I love #{fruit}” }
  37. EACH Use each for iterating • fruits.each do |fruit| •

    puts “I love #{fruit}” • end Use do & end for multi-line, {} for single-line • fruits.each {|fruit| puts “I love #{fruit}” } Same syntax works for other forms of iterating • .map • .each_with_index • .each_key
  38. OBJECTS Objects • class Person end Inheritance • class Programmer

    < Person end Constructors • class Person def initialize(name) @name = name end end
  39. RUBY ON RAILS What is Rails • Web Framework •

    Convention over Configuration • Geared toward database-backed web applications • Great for producing APIS
  40. EXAMPLE RAILS APP Demo time! • rails new demo •

    cd demo • rails generate scaffold person name:string age:integer • rails server
  41. PARSING JSON In Rails • JSON.parse(json) Rhodes • Rho::JSON.parse(json) Both

    turn JSON into a Hash • { "name": "Bob", "age": 20, "friends": ["Alice", "Carol", "Dave"] } • { "name" => "Bob", "age" => 20, "friends" => ["Alice", "Carol", "Dave"] }
  42. XML IN RUBY XML is as easy as JSON •

    REXML::Document.new(xml_file)
  43. DEBUGGING Read the Errors • They tell you line numbers

    NameError: undefined local variable or method `my_method' for #<Class: 0x007fef2bc51ee0> from /Users/daniel/.rvm/gems/ruby-1.9.3-p194@ project/gems/ activerecord-3.2.2/lib/active_record/dynamic_matchers.rb:50:in `method_missing' from /Users/daniel/Projects/my_project/app/models/sign.rb:16:in `import' from (irb):4 from /Users/daniel/.rvm/gems/ruby-1.9.3-p194@project/gems/railties-3.2.2/lib/ rails/commands/console.rb:47:in `start' from /Users/daniel/.rvm/gems/ruby-1.9.3-p194@ project/gems/railties-3.2.2/lib/ rails/commands/console.rb:8:in `start' from /Users/daniel/.rvm/gems/ruby-1.9.3-p194@ project/gems/railties-3.2.2/lib/ rails/commands.rb:41:in `<top (required)>' from script/rails:6:in `require' from script/rails:6:in `<main>'
  44. DEBUGGING Read the Errors • They tell you line numbers

    NameError: undefined local variable or method `my_method' for #<Class: 0x007fef2bc51ee0> from /Users/daniel/.rvm/gems/ruby-1.9.3-p194@ project/gems/ activerecord-3.2.2/lib/active_record/dynamic_matchers.rb:50:in `method_missing' from /Users/daniel/Projects/my_project/app/models/sign.rb:16:in `import' from (irb):4 from /Users/daniel/.rvm/gems/ruby-1.9.3-p194@project/gems/railties-3.2.2/lib/ rails/commands/console.rb:47:in `start' from /Users/daniel/.rvm/gems/ruby-1.9.3-p194@ project/gems/railties-3.2.2/lib/ rails/commands/console.rb:8:in `start' from /Users/daniel/.rvm/gems/ruby-1.9.3-p194@ project/gems/railties-3.2.2/lib/ rails/commands.rb:41:in `<top (required)>' from script/rails:6:in `require' from script/rails:6:in `<main>'
  45. DEBUGGING Read the Errors • They tell you line numbers

    NameError: undefined local variable or method `my_method' for #<Class: 0x007fef2bc51ee0> from /Users/daniel/.rvm/gems/ruby-1.9.3-p194@ project/gems/ activerecord-3.2.2/lib/active_record/dynamic_matchers.rb:50:in `method_missing' from /Users/daniel/Projects/my_project/app/models/sign.rb:16:in `import' from (irb):4 from /Users/daniel/.rvm/gems/ruby-1.9.3-p194@project/gems/railties-3.2.2/lib/ rails/commands/console.rb:47:in `start' from /Users/daniel/.rvm/gems/ruby-1.9.3-p194@ project/gems/railties-3.2.2/lib/ rails/commands/console.rb:8:in `start' from /Users/daniel/.rvm/gems/ruby-1.9.3-p194@ project/gems/railties-3.2.2/lib/ rails/commands.rb:41:in `<top (required)>' from script/rails:6:in `require' from script/rails:6:in `<main>'
  46. DEBUGGING Read the Errors • They sometimes confuse you @user.first_name

    NoMethodError: undefined method `first_name' for nil:NilClass from (irb):1 from /Users/daniel/.rvm/gems/ruby-1.9.3-p194@signwars/gems/railties-3.2.2/ lib/rails/commands/console.rb:47:in `start' from /Users/daniel/.rvm/gems/ruby-1.9.3-p194@signwars/gems/railties-3.2.2/ lib/rails/commands/console.rb:8:in `start' from /Users/daniel/.rvm/gems/ruby-1.9.3-p194@signwars/gems/railties-3.2.2/ lib/rails/commands.rb:41:in `<top (required)>' from script/rails:6:in `require' from script/rails:6:in `<main>'
  47. DEBUGGING Read the Errors • They sometimes confuse you @user.first_name

    NoMethodError: undefined method `first_name' for nil:NilClass from (irb):1 from /Users/daniel/.rvm/gems/ruby-1.9.3-p194@signwars/gems/railties-3.2.2/ lib/rails/commands/console.rb:47:in `start' from /Users/daniel/.rvm/gems/ruby-1.9.3-p194@signwars/gems/railties-3.2.2/ lib/rails/commands/console.rb:8:in `start' from /Users/daniel/.rvm/gems/ruby-1.9.3-p194@signwars/gems/railties-3.2.2/ lib/rails/commands.rb:41:in `<top (required)>' from script/rails:6:in `require' from script/rails:6:in `<main>'
  48. LEARN MORE Documentation • http://ruby-doc.org • http://api.rubyonrails.org TryRuby • http://tryruby.org

    This Presentation • https://speakerdeck.com/u/danielmorrison • or shorter URL: http://bit.ly/LqCinu Talk to Me • @danielmorrison • http://collectiveidea.com