Ruby and OO for Beginners

427 views

Published on

In this talk from Triangle.rb, Cory Foy goes over basic language features of Ruby, along with some gotchas from David Black's "The Well Grounded Rubyist". We cover variables, classes, blocks, and other aspects.

Published in: Software, Technology, Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
427
On SlideShare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Ruby and OO for Beginners

  1. 1. Ruby and OO Cory Foy | @cory_foy http://www.coryfoy.com Triangle.rb June 24, 2014 Thursday, June 26, 14
  2. 2. Triangle.rb Meetup June 25th, 2012 Cory Foy | @cory_foy http://www.coryfoy.com Ruby and OO Overview • What is Ruby? • Ruby Basics • Advanced Ruby • Wrap-up Thursday, June 26, 14
  3. 3. Triangle.rb Meetup June 25th, 2012 Cory Foy | @cory_foy http://www.coryfoy.com Ruby and OO What is Ruby? • First released in 1995 by Yukihiro Matsumoto (Matz) • Object-Oriented – number = 1.abs #instead of Math.abs(1) • Dynamically Typed – result = 1+3 Thursday, June 26, 14
  4. 4. Triangle.rb Meetup June 25th, 2012 Cory Foy | @cory_foy http://www.coryfoy.com Ruby and OO What is Ruby? • http://www.rubygarden.org/faq/entry/show/3 class Person attr_accessor :name, :age # attributes we can set and retrieve def initialize(name, age) # constructor method @name = name # store name and age for later retrieval @age = age.to_i # (store age as integer) end def inspect # This method retrieves saved values "#{@name} (#{@age})" # in a readable format end end p1 = Person.new('elmo', 4) # elmo is the name, 4 is the age puts p1.inspect # prints “elmo (4)” Thursday, June 26, 14
  5. 5. Triangle.rb Meetup June 25th, 2012 Cory Foy | @cory_foy http://www.coryfoy.com Ruby and OO Will It Change Your Life? • Yes! • Ok, Maybe • It’s fun to program with • And what is programming if it isn’t fun? Thursday, June 26, 14
  6. 6. Triangle.rb Meetup June 25th, 2012 Cory Foy | @cory_foy http://www.coryfoy.com Ruby and OO Ruby Basics • Variables, Classes and Methods • Properties / Attributes • Exceptions • Access Control • Importing Files and Libraries • Duck Typing Thursday, June 26, 14
  7. 7. Triangle.rb Meetup June 25th, 2012 Cory Foy | @cory_foy http://www.coryfoy.com Ruby and OO Ruby Basics - Variables • Local (lowercase, underscores) – fred_j = Person.new(“Fred”) • Instance (@ sign with lowercase) – @name = name • Class (@@ with lowercase) – @@error_email = “testing@test.com” • Constant (Starts with uppercase) – MY_PI = 3.14 – class Move • Global ($ with name) – $MEANING_OF_LIFE = 42 Thursday, June 26, 14
  8. 8. Triangle.rb Meetup June 25th, 2012 Cory Foy | @cory_foy http://www.coryfoy.com Ruby and OO Variables contain references to objects Thursday, June 26, 14
  9. 9. Triangle.rb Meetup June 25th, 2012 Cory Foy | @cory_foy http://www.coryfoy.com Ruby and OO Ruby Basics - Classes • Class definitions are started with class,are named with a CamelCase name, and ended with end class Move attr_accessor :up, :right def initialize(up, right) @up = up @right = right end end Thursday, June 26, 14
  10. 10. Triangle.rb Meetup June 25th, 2012 Cory Foy | @cory_foy http://www.coryfoy.com Ruby and OO Classes (and Modules) are Objects Thursday, June 26, 14
  11. 11. Triangle.rb Meetup June 25th, 2012 Cory Foy | @cory_foy http://www.coryfoy.com Ruby and OO Ruby Basics - Classes • Attributes and fields normally go at the beginning of the class definition class Move attr_accessor :up, :right def initialize(up, right) @up = up @right = right end end Thursday, June 26, 14
  12. 12. Triangle.rb Meetup June 25th, 2012 Cory Foy | @cory_foy http://www.coryfoy.com Ruby and OO Ruby Basics - Classes • initialize is the same concept as a constructor from .NET or Java, and is called when someone invokes your object using Move.new to set up the object’s state class Move attr_accessor :up, :right def initialize(up, right) @up = up @right = right end end Thursday, June 26, 14
  13. 13. Triangle.rb Meetup June 25th, 2012 Cory Foy | @cory_foy http://www.coryfoy.com Ruby and OO Ruby Basics - Methods • Methods return the last expression evaluated. You can also explicitly return from methods class Move def up @up end def right return @right end end Thursday, June 26, 14
  14. 14. Triangle.rb Meetup June 25th, 2012 Cory Foy | @cory_foy http://www.coryfoy.com Ruby and OO Every Expression Evaluates to an Object Thursday, June 26, 14
  15. 15. Triangle.rb Meetup June 25th, 2012 Cory Foy | @cory_foy http://www.coryfoy.com Ruby and OO Ruby Basics - Methods • Methods can take in specified parameters, and also parameter lists (using special notation) class Move def initialize(up, right) @up = up @right = right end end Thursday, June 26, 14
  16. 16. Triangle.rb Meetup June 25th, 2012 Cory Foy | @cory_foy http://www.coryfoy.com Ruby and OO It’s All About Sending Messages to Objects Thursday, June 26, 14
  17. 17. Triangle.rb Meetup June 25th, 2012 Cory Foy | @cory_foy http://www.coryfoy.com Ruby and OO Ruby Basics - Methods • Class (“Static”) methods start with either self. or Class. class Move def self.create return Move.new end def Move.logger return @@logger end end Thursday, June 26, 14
  18. 18. Triangle.rb Meetup June 25th, 2012 Cory Foy | @cory_foy http://www.coryfoy.com Ruby and OO Ruby Basics - Properties • Ruby supports the concept of Properties (called Attributes) class Move def up @up end end class Move def up=(val) @up = val end end move = Move.new move.up = 15 puts move.up #15 Thursday, June 26, 14
  19. 19. Triangle.rb Meetup June 25th, 2012 Cory Foy | @cory_foy http://www.coryfoy.com Ruby and OO Ruby Basics - Properties • Ruby also provides convenience methods for doing this class Move attr_accessor :up #Same thing as last slide end move = Move.new move.up = 15 puts move.up #15 Thursday, June 26, 14
  20. 20. Triangle.rb Meetup June 25th, 2012 Cory Foy | @cory_foy http://www.coryfoy.com Ruby and OO Ruby Basics - Properties • You can specify read or write only attributes as well class Move attr_reader :up #Can’t write attr_writer :down #Can’t read end move = Move.new move.up = 15 #error d = move.down #error Thursday, June 26, 14
  21. 21. Triangle.rb Meetup June 25th, 2012 Cory Foy | @cory_foy http://www.coryfoy.com Ruby and OO Ruby Basics - Exceptions • Ruby has an Exception hierarchy • Exceptions can be caught, raised and handled • You can also easily retry a block of code when you encounter an exception Thursday, June 26, 14
  22. 22. Triangle.rb Meetup June 25th, 2012 Cory Foy | @cory_foy http://www.coryfoy.com Ruby and OO Ruby Basics - Exceptions process_file = File.open(“testfile.csv”) begin #put exceptional code in begin/end block #...process file rescue IOError => io_error puts “IOException occurred. Retrying.” retry #starts block over from begin rescue => other_error puts “Bad stuff happened: “ + other_error else #happens if no exceptions occur puts “No errors in processing. Yippee!” ensure # similar to finally in .NET/Java process_file.close unless process_file.nil? end Thursday, June 26, 14
  23. 23. Triangle.rb Meetup June 25th, 2012 Cory Foy | @cory_foy http://www.coryfoy.com Ruby and OO Ruby Basics – Access Control • Ruby supports Public, Protected and Private methods • Private methods can only be accessed from the instance of the object, not from any other object, even those of the same class as the instance Thursday, June 26, 14
  24. 24. Triangle.rb Meetup June 25th, 2012 Cory Foy | @cory_foy http://www.coryfoy.com Ruby and OO Ruby Basics – Access Control • Access is controlled by using keywords class Move private def calculate_move end #Any subsequent methods will be private until.. public def show_move end #Any subsequent methods will now be public end Thursday, June 26, 14
  25. 25. Triangle.rb Meetup June 25th, 2012 Cory Foy | @cory_foy http://www.coryfoy.com Ruby and OO Ruby Basics – Access Control • Methods can also be passed as args class Move def calculate_move end def show_move end public :show_move protected :calculate_move end Thursday, June 26, 14
  26. 26. Triangle.rb Meetup June 25th, 2012 Cory Foy | @cory_foy http://www.coryfoy.com Ruby and OO Ruby Basics - Imports • To use a class from another file in your class, you must tell your source file where to find the class you want to use require ‘calculator’ class Move def calculate_move return @up * Calculator::MIN_MOVE end end Thursday, June 26, 14
  27. 27. Triangle.rb Meetup June 25th, 2012 Cory Foy | @cory_foy http://www.coryfoy.com Ruby and OO Ruby Basics - Imports • There are two types of imports – require • Only loads the file once – load • Loads the file every time the method is executed • Both accept relative and absolute paths, and will search the current load path for the file Thursday, June 26, 14
  28. 28. Triangle.rb Meetup June 25th, 2012 Cory Foy | @cory_foy http://www.coryfoy.com Ruby and OO Ruby Basics – Duck Typing • What defines an object? • How can you tell a car is a car? – By model? – By name? • Or, by it’s behavior? Thursday, June 26, 14
  29. 29. Triangle.rb Meetup June 25th, 2012 Cory Foy | @cory_foy http://www.coryfoy.com Ruby and OO Ruby Basics – Duck Typing • We’d use static typing! So only the valid object could be passed in • What if my object has the same behavior as a Car? class CarWash def accept_customer(car) end end • How would we validate this in .NET or Java? Thursday, June 26, 14
  30. 30. Triangle.rb Meetup June 25th, 2012 Cory Foy | @cory_foy http://www.coryfoy.com Ruby and OO Ruby Basics – Duck Typing • What is this? Thursday, June 26, 14
  31. 31. Triangle.rb Meetup June 25th, 2012 Cory Foy | @cory_foy http://www.coryfoy.com Ruby and OO Ruby Basics – Duck Typing • How about this? Thursday, June 26, 14
  32. 32. Triangle.rb Meetup June 25th, 2012 Cory Foy | @cory_foy http://www.coryfoy.com Ruby and OO Ruby Basics – Duck Typing • What about this? Thursday, June 26, 14
  33. 33. Triangle.rb Meetup June 25th, 2012 Cory Foy | @cory_foy http://www.coryfoy.com Ruby and OO Ruby Basics – Duck Typing • We know objects based on the behaviors and attributes the object possesses • This means if the object passed in can act like the object we want, that should be good enough for us! Thursday, June 26, 14
  34. 34. Triangle.rb Meetup June 25th, 2012 Cory Foy | @cory_foy http://www.coryfoy.com Ruby and OO Ruby Basics – Duck Typing • Or we could just let it fail as a runtime error Class CarWash def accept_customer(car) if car.respond_to?(:drive_to) @car = car wash_car else reject_customer end end end Thursday, June 26, 14
  35. 35. Triangle.rb Meetup June 25th, 2012 Cory Foy | @cory_foy http://www.coryfoy.com Ruby and OO Advanced Ruby - Blocks • A block is just a section of code between a set of delimters – { } or do..end { puts “Ho” } 3.times do puts “Ho “ end #prints “Ho Ho Ho” Thursday, June 26, 14
  36. 36. Triangle.rb Meetup June 25th, 2012 Cory Foy | @cory_foy http://www.coryfoy.com Ruby and OO Advanced Ruby - Blocks • Blocks can be associated with method invocations. The methods call the block using yield def format_print puts “Confidential. Do Not Disseminate.” yield puts “© SomeCorp, 2006” end format_print { puts “My name is Earl!” } -> Confidential. Do Not Disseminate. -> My name is Earl! -> © SomeCorp, 2006 Thursday, June 26, 14
  37. 37. Triangle.rb Meetup June 25th, 2012 Cory Foy | @cory_foy http://www.coryfoy.com Ruby and OO Advanced Ruby - Blocks • We can check to see if a block was passed to our method def MyConnection.open(*args) conn = Connection.open(*args) if block_given? yield conn #passes conn to the block conn.close #closes conn when block finishes end return conn end Thursday, June 26, 14
  38. 38. Triangle.rb Meetup June 25th, 2012 Cory Foy | @cory_foy http://www.coryfoy.com Ruby and OO Advanced Ruby - Iterators • Iterators in Ruby are simply methods that can invoke a block of code • Iterators typically pass one or more values to the block to be evaluated Thursday, June 26, 14
  39. 39. Triangle.rb Meetup June 25th, 2012 Cory Foy | @cory_foy http://www.coryfoy.com Ruby and OO Advanced Ruby - Iterators def fib_up_to(max) i1, i2 = 1, 1 while i1 <= max yield i1 i1, i2 = i2, i1+i2 # parallel assignment end end fib_up_to(100) {|f| print f + “ “} -> 1 1 2 3 5 8 13 21 34 55 89 • Pickaxe Book, page 50 Thursday, June 26, 14
  40. 40. Triangle.rb Meetup June 25th, 2012 Cory Foy | @cory_foy http://www.coryfoy.com Ruby and OO Advanced Ruby - Modules • At their core, Modules are like namespaces in .NET or Java. module Kite def Kite.fly end end module Plane def Plane.fly end end Thursday, June 26, 14
  41. 41. Triangle.rb Meetup June 25th, 2012 Cory Foy | @cory_foy http://www.coryfoy.com Ruby and OO Advanced Ruby - Mixins • Modules can’t have instances – they aren’t classes • But Modules can be included in classes, who inherit all of the instance method definitions from the module • This is called a mixin and is how Ruby does “Multiple Inheritance” Thursday, June 26, 14
  42. 42. Triangle.rb Meetup June 25th, 2012 Cory Foy | @cory_foy http://www.coryfoy.com Ruby and OO Advanced Ruby - Mixins module Print def print puts “Company Confidential” yield end end class Document include Print #... end doc = Document.new doc.print { “Fourth Quarter looks great!” } -> Company Confidential -> Fourth Quarter looks great! Thursday, June 26, 14
  43. 43. Triangle.rb Meetup June 25th, 2012 Cory Foy | @cory_foy http://www.coryfoy.com Ruby and OO Advanced Ruby - Reflection • How could we call the Length of a String at runtime in .NET? String myString = "test"; int len = (int)myString .GetType() .InvokeMember("Length", System.Reflection.BindingFlags.GetProperty, null, myString, null); Console.WriteLine("Length: " + len.ToString()); Thursday, June 26, 14
  44. 44. Triangle.rb Meetup June 25th, 2012 Cory Foy | @cory_foy http://www.coryfoy.com Ruby and OO Advanced Ruby - Reflection • In Ruby, we can just send the command to the object myString = “Test” puts myString.send(:length) # 4 Thursday, June 26, 14
  45. 45. Triangle.rb Meetup June 25th, 2012 Cory Foy | @cory_foy http://www.coryfoy.com Ruby and OO Advanced Ruby - Reflection • We can also do all kinds of fancy stuff #print out all of the objects in our system ObjectSpace.each_object(Class) {|c| puts c} #Get all the methods on an object “Some String”.methods #see if an object responds to a certain method obj.respond_to?(:length) #see if an object is a type obj.kind_of?(Numeric) obj.instance_of?(FixNum) Thursday, June 26, 14
  46. 46. Triangle.rb Meetup June 25th, 2012 Cory Foy | @cory_foy http://www.coryfoy.com Ruby and OO Sending Can Be Very, Very Bad Thursday, June 26, 14
  47. 47. Triangle.rb Meetup June 25th, 2012 Cory Foy | @cory_foy http://www.coryfoy.com Ruby and OO Ruby Basics – Other Goodies • RubyGems – Package Management for Ruby Libraries • Rake – A Pure Ruby build tool (can use XML as well for the build files) • RDoc – Automatically extracts documentation from your code and comments Thursday, June 26, 14
  48. 48. Triangle.rb Meetup June 25th, 2012 Cory Foy | @cory_foy http://www.coryfoy.com Ruby and OO Ruby Resources • Programming Ruby by Dave Thomas (the Pickaxe Book) • http://www.ruby-lang.org • http://www.rubycentral.org • http://www.ruby-doc.org • http://www.triangleruby.com • http://www.manning.com/black3/ • http://www.slideshare.net/dablack/wgnuby Thursday, June 26, 14
  49. 49. Cory Foy foyc@coryfoy.com @cory_foy blog.coryfoy.com prettykoolapps.com coryfoy.com Thursday, June 26, 14

×