Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Intro to ruby

960 views

Published on

Introduction to Ruby with accompanying code at https://github.com/heatherjc07/RubyIntroduction. Covers flow control, methods, classes and types

Published in: Technology, Education
  • Be the first to comment

Intro to ruby

  1. 1. Intro to Ruby Women Who Code Belfast h.campbell@kainos.com : hcampbell07 : heatherjcampbell.com
  2. 2. Syntactic Sugar Productive Developers
  3. 3. • Everything is an Expression • Everything is an Object • Supports Dynamic Reflection
  4. 4. GETTING STARTED
  5. 5. current_count = 5 final_salary = 30000.00 Snake Case Readable
  6. 6. String.methods.sort String.instance_methods.sort Methods
  7. 7. my_array.empty? person.retired? True or False
  8. 8. str.upcase vs str.upcase! Create New vs Modify Existing
  9. 9. io.rb print “Enter your name: ” name = gets puts name.strip + “ is learning Ruby” Input / Output
  10. 10. [4,2,3,5].sort.map{ |e| e * e}.join(',') # "4,9,16,25" Method Chaining
  11. 11. • Write some code to ask a user to input a number. Take the number multiply it by 10 and display it back to the user • Find a method to capitalize a string • Check the class of 1. (using the .class method) then find a method to check if the number is even Exercises
  12. 12. TYPES
  13. 13. true.class # TrueClass false.class # FalseClass true.to_s # "true" Boolean
  14. 14. 1.class # Fixnum 1111111111.class # Bignum Fixnum.superclass # Integer Bignum.superclass # Integer 111_000_000.class # Fixnum 1.2345.class # Float Numbers
  15. 15. String.method.count # Lots of helpful methods! "Ruby" * 4 # "RubyRubyRubyRuby" "Ruby" + " " + "Ruby" # "Ruby Ruby" a = "I don’t know Ruby" a*"don’t"+ = "do" # "I do know Ruby" String
  16. 16. number_of_girls = 4 number_of_boys = 6 puts "number of girls #{number_of_girls}" puts "number of boys #{number_of_boys}" puts "number of people #{number_of_boys + number_of_girls}" Interpolation
  17. 17. phone = "(028 90)454 545" phone.gsub!(/D/, "") puts "Phone Number : #{phone}" # "02890454545" puts "Heather Campbell".gsub(/([a-zA-Z]+) ([a-zA-Z]+)/, "2, 1") # "Campbell, Heather" Regex
  18. 18. attr_accessor :driver :small :medium :large a = :small b = :small a.object_id == b.object_id # true :small.to_s # "small " "small".to_sym # :small Symbols
  19. 19. arr = [1,2,'three', :big] arr.size # 4 arr.empty? # false arr[1] # 2 arr[-1] # :big arr[1..3] # [2,'three', :big] arr[4..5] = [:east, :west] # [1,2,'three', :big, :east, :west] arr << 10 # [1,2,'three', :big, :east, :west,10] Arrays
  20. 20. [1,2,3].map { |e| e * e} # [1,4,9] [2,2,3].reduce{|total,v| total * v} # 12 ['act', 'bat', 'them'] .all? { |w| w.length >= 3 } # true Enumerable
  21. 21. h = {'France' => 'Paris', 'Ireland' => 'Dublin' } h = {France: 'Paris', Ireland: 'Dublin' } h[:France] # 'Paris‘ h[:Italy] = 'Rome' # h = {France: 'Paris', Ireland: 'Dublin', Italy: # 'Rome' } h.each {|k,v| puts "key: #{k} t value: #{v}"} h.any? { |k,v| v == 'Rome' } Hashes
  22. 22. (1..5).each{|v| p v} # 1,2,3,4,5 (1…5).each{|v| p v} # 1,2,3,4 (10..20).include?(19) # true (2..5).end # 5 ("aa".."ae").each{|v| p v} # "aa","ab","ac","ad","ae" Ranges
  23. 23. def get_values; [1,2,3,4]; end; first, _, _, last = get_values # first = 1, last = 4 a, *b, c = get_values # a = 1, b = [2,3],c = 4 r = (0..5) a = [1,2,*r] # a = [1,2,0,1,2,3,4,5] Splat Operator
  24. 24. • • Separate an array [1,2,3,4] into 2 variables one holding the head of the array (i.e 1) and the other the rest of the array [2,3,4] Create a hash of months and days in a month e.g. {January: 31, ..}. For each month print out the month name and number of days. Then print out totals days in year by summing the hashes values Exercises
  25. 25. FLOW CONTROL
  26. 26. if mark > 75 report = "great" elsif mark > 50 report = "good" else report = "needs work" end report = if mark > 75 then "great" elsif mark > 50 then "good" else "needs work" end if else
  27. 27. if !order.nil? order.calculate_tax end order.calculate_tax unless order.nil? unless
  28. 28. speed = 60 limit = 40 speed > limit ? puts("Speeding!") : puts("Within Limit") ternary operator
  29. 29. mark = 42 && mark * 2 # translates to mark = (42 && mark) * 2 mark = 42 and mark * 2 # returns 84 post = Posts.locate(post_id) and post.publish # publishes post if it is located if engine.cut_out? engine.restart or enable_emergency_power end and / or
  30. 30. grade = case mark when 90..100 "A" when 70..89 "B" when 60..69 "C" when 50..59 "D" when 40..49 "E" else "F" end case unit when String puts "A String!" when TrueClass puts "So True!" when FalseClass puts "So False!" end case
  31. 31. while count < max puts "Inside the loop. count = #{count}" count +=1 end puts "count = #{count += 1}" while count < max while
  32. 32. until count > max puts "Inside the loop. count = #{count}" count +=1 end array = [1,2,3,4,5,6,7] array.pop until array.length < 3 until
  33. 33. begin puts "Inside the loop. count = #{count}" count +=1 end while count < max looping block
  34. 34. for count in (1..10) puts "Inside the loop: count = #{count}" end for
  35. 35. animals = {cat: "meow ", cow: "moo "} animals.each do |k,v| puts "The #{k} goes #{v}" end animals = {cat: "meow ", cow: "moo "} animals.each {|k,v| puts "The #{k} goes #{v} "} iterators
  36. 36. magic_number = 5; found = false; i = 0; input = 0; while i < 3 print "Please enter a number between 1 and 10: " input = gets.to_i unless input.between?(1,10) print "invalid number"; redo end if input == magic_number found = true; break end i += 1 end found ? put "found! " : put " bad luck " flow control
  37. 37. def display_content(name) f = File.open(name, 'r') line_num=0 # raise 'A test exception.' f.each {|line| print "#{line_num += 1} #{line}"} rescue Exception => e puts "ooops"; puts e.message; puts e.backtrace else puts "nSuccessfully displayed!" ensure if f then f.close; puts "file safely closed"; end end exception handling
  38. 38. def get_patients() patients = API.request("/patients") rescue RuntimeError => e attempts ||= 0 attempts += 1 if attempts < 3 puts e.message + ". Retrying request. “ retry else puts "Failed to retrieve patients" raise end end exception handling
  39. 39. • • • • Write some conditional logic to capitalize a string if it is not in uppercase Print out your name 10 times Print the string “This is sentence number 1” where the number 1 changes from 1 to 10 Write a case statements which outputs “Integer” if the variable is an integer, “Float” if it is a floating point number or else “don’t know!” Exercises
  40. 40. CLASSES
  41. 41. class Vehicle def drive(destination) @destination = destination end end Classes
  42. 42. class Vehicle attr_accessor :destination def drive(destination) self.destination = destination # do more drive stuff end end Accessors
  43. 43. attr_accessor attr_reader attr_writer Accessors
  44. 44. class Vehicle attr_accessor :colour, :make def initialize(colour, make) @make = make @colour = colour end end Constructor
  45. 45. class SuperCar < Vehicle def drive(destination) self.destination = destination puts 'driving super fast' end end Inheritance
  46. 46. class SuperCar < Vehicle attr_accessor :driver def drive(circuit, driver) self.destination = destination self.driver = driver puts 'driving super fast' end end Inheritance
  47. 47. “If it walks like a duck and talks like a duck, it must be a duck” Duck Typing
  48. 48. class Person def quack() puts 'pretends to quack' end end class Duck def quack() puts 'quack quack' end end Duck Typing
  49. 49. def call_quack(duck) duck.quack end call_quack(Duck.new) # quack quack call_quack(Person.new) # pretends to quack Duck Typing
  50. 50. class Vehicle class Vehicle def crash() explode end def crash() explode end private def explode() puts "Boom!" end end def explode() puts "Boom!" end private :explode end Method Visibility
  51. 51. class SuperCar < Vehicle def explode() puts "Massive Boom!" end end Method Visibility
  52. 52. result = class Test answer = 7+5 puts " Calculating in class: " + answer.to_s answer end puts "Output of the class: " + result.to_s Executable
  53. 53. class Rocket …. end r = Rocket.new class Rocket def land() puts "Back on Earth" end end r.land Open Classes
  54. 54. class String def shout self.upcase! self + "!!!" end def empty? true end end Monkey Patching
  55. 55. a = "abc" b=a c = "abc" a.equal?(b) # true a.equal?(c) # false a == b # true a == c # true Equality
  56. 56. • • • • • • Create a class to represent a Computer Create an instance of the Computer called computer Add a starting_up method Create a class WindowsComputer which inherits from Computer Create an instance of the WindowsComputer called wcomputer and call starting_up on it Alter WindowsComputer to allow the user to set a name value when they create an instance. Allow the user to set and get the name attribute Exercises
  57. 57. METHODS
  58. 58. # Java public Car() , …public Car(String make) { } public Car(String make, String model) { } public Car(String make, String model, String colour) { } # Ruby def initialize (make = :Ford, model = Car.get_default_model(make), colour = (make == :Ferrari ? 'red' : 'silver') ) … end Overloading Methods
  59. 59. def create_car (make = :Ford, model = get_default_model(make), colour) … end create_car('red' ) Method Parameters
  60. 60. def produce_student(name, *subjects) … end produce_student('June Black', 'Chemistry', 'Maths', 'Computing' ) subject_list = ['Chemistry', 'Maths', 'Computing'] produce_student('June Black', *subject_list) Variable Length Param List
  61. 61. class Meteor attr_accessor :speed def initialize() @speed = 0 end def +(amt) @speed += amt end def -(amt) @speed > amt ? (@speed -= amt) : (@speed = 0) end end Operators
  62. 62. class Roman def self.method_missing name, *args roman = name.to_s roman.gsub!("IV", "IIII") roman.gsub!("IX", "VIIII") roman.gsub!("XL", "XXXX") roman.gsub!("XC", "LXXXX") (roman.count("I") + roman.count("V") * 5 + roman.count("X") * 10 + roman.count("L") * 50 + roman.count("C") * 100) end end Method Missing
  63. 63. handlers = { up_arrow: :tilt_up, down_arrow: :tilt_down, left_arrow: :turn_left, right_arrow: :turn_right} ship.__send__(handlers[input]) Send
  64. 64. • • • • • • Alter the WindowsComputer class you created in the last exercise to make the name parameter optional Try creating an instance with and without a name value Add a mandatory attribute called owner to the class and alter initialize to set it. Try creating a new instance with no, 1 and 2 parameter values. What happens? add a method display_details to output the name and owner of the machine and try calling it using __send__ now make display_details private and try calling it directly and using __send__. Notice anything odd? Exercises
  65. 65. OTHER FEATURES
  66. 66. def block_example puts 'Optional block example.' if block_given? yield "Heather" else puts 'No block. Very Empty' end puts 'End of example' end Blocks
  67. 67. def with_timing start = Time.now if block_given? yield puts 'Time taken: #{Time.now - start}' end end Blocks
  68. 68. def add_numbers(x, y) x+y end alter the above method to accept a block and execute it if one is supplied. Call it with a block to provide debug i.e. displaying the method name and values passed Exercises
  69. 69. TESTING
  70. 70. Test Driven Development Behaviour Driven Development
  71. 71. require 'minitest/autorun' require '../lib/People' class TestEmployee < MiniTest::Unit::TestCase def setup @employee = Employee.new end def test_employer assert_equal "Kainos", @employee.employer end end MiniTest
  72. 72. require "minitest/autorun" describe Employee do before do @employee = Employee.new end describe "when asked for an employer" do it "must provide one" do @employee.employer.must_equal "Kainos" end end end MiniTest
  73. 73. # bowling_spec.rb require 'bowling' describe Bowling, "#score" do it "returns 0 for all gutter game" do bowling = Bowling.new 20.times { bowling.hit(0) } bowling.score.should eq(0) end end RSpec
  74. 74. # division.feature Feature: Division In order to avoid silly mistakes Cashiers must be able to calculate a fraction Scenario: Regular numbers * I have entered 3 into the calculator * I have entered 2 into the calculator * I press divide * the result should be 1.5 on the screen Cucumber
  75. 75. #calculator_steps.rb Before do @calc = Calculator.new end Given /I have entered (d+) into the calculator/ do |n| @calc.push n.to_i end When /I press (w+)/ do |op| @result = @calc.send op end Cucumber
  76. 76. Want to Learn More? Codecademy http://www.codecademy.com/tracks/ruby CodeSchool https://www.codeschool.com/paths/ruby Seven Languages in Seven Weeks pragprog.com/book/btlang/seven-languages-in-seven-weeks
  77. 77. Want to Learn More? Programming Ruby pragprog.com/book/ruby/programming-ruby First edition available for free online at http://ruby-doc.com/docs/ProgrammingRuby/ Ruby Koans http://rubykoans.com Pluralsight
  78. 78. Any Questions?

×