Download - Ruby and OO for Beginners
![Page 1: Ruby and OO for Beginners](https://reader033.vdocument.in/reader033/viewer/2022052822/554f3e2bb4c90572088b5134/html5/thumbnails/1.jpg)
Ruby and OO
Cory Foy | @cory_foyhttp://www.coryfoy.com
Triangle.rb
June 24, 2014
Thursday, June 26, 14
![Page 2: Ruby and OO for Beginners](https://reader033.vdocument.in/reader033/viewer/2022052822/554f3e2bb4c90572088b5134/html5/thumbnails/2.jpg)
Triangle.rb MeetupJune 25th, 2012
Cory Foy | @cory_foyhttp://www.coryfoy.comRuby and OO
Overview• What is Ruby?• Ruby Basics• Advanced Ruby• Wrap-up
Thursday, June 26, 14
![Page 3: Ruby and OO for Beginners](https://reader033.vdocument.in/reader033/viewer/2022052822/554f3e2bb4c90572088b5134/html5/thumbnails/3.jpg)
Triangle.rb MeetupJune 25th, 2012
Cory Foy | @cory_foyhttp://www.coryfoy.comRuby 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
![Page 4: Ruby and OO for Beginners](https://reader033.vdocument.in/reader033/viewer/2022052822/554f3e2bb4c90572088b5134/html5/thumbnails/4.jpg)
Triangle.rb MeetupJune 25th, 2012
Cory Foy | @cory_foyhttp://www.coryfoy.comRuby 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
![Page 5: Ruby and OO for Beginners](https://reader033.vdocument.in/reader033/viewer/2022052822/554f3e2bb4c90572088b5134/html5/thumbnails/5.jpg)
Triangle.rb MeetupJune 25th, 2012
Cory Foy | @cory_foyhttp://www.coryfoy.comRuby 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
![Page 6: Ruby and OO for Beginners](https://reader033.vdocument.in/reader033/viewer/2022052822/554f3e2bb4c90572088b5134/html5/thumbnails/6.jpg)
Triangle.rb MeetupJune 25th, 2012
Cory Foy | @cory_foyhttp://www.coryfoy.comRuby and OO
Ruby Basics• Variables, Classes and Methods• Properties / Attributes• Exceptions• Access Control• Importing Files and Libraries• Duck Typing
Thursday, June 26, 14
![Page 7: Ruby and OO for Beginners](https://reader033.vdocument.in/reader033/viewer/2022052822/554f3e2bb4c90572088b5134/html5/thumbnails/7.jpg)
Triangle.rb MeetupJune 25th, 2012
Cory Foy | @cory_foyhttp://www.coryfoy.comRuby and OO
Ruby Basics - Variables• Local (lowercase, underscores)
– fred_j = Person.new(“Fred”)
• Instance (@ sign with lowercase)– @name = name
• Class (@@ with lowercase)– @@error_email = “[email protected]”
• Constant (Starts with uppercase)– MY_PI = 3.14– class Move
• Global ($ with name)– $MEANING_OF_LIFE = 42
Thursday, June 26, 14
![Page 8: Ruby and OO for Beginners](https://reader033.vdocument.in/reader033/viewer/2022052822/554f3e2bb4c90572088b5134/html5/thumbnails/8.jpg)
Triangle.rb MeetupJune 25th, 2012
Cory Foy | @cory_foyhttp://www.coryfoy.comRuby and OO
Variables contain references to objects
Thursday, June 26, 14
![Page 9: Ruby and OO for Beginners](https://reader033.vdocument.in/reader033/viewer/2022052822/554f3e2bb4c90572088b5134/html5/thumbnails/9.jpg)
Triangle.rb MeetupJune 25th, 2012
Cory Foy | @cory_foyhttp://www.coryfoy.comRuby 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 endend
Thursday, June 26, 14
![Page 10: Ruby and OO for Beginners](https://reader033.vdocument.in/reader033/viewer/2022052822/554f3e2bb4c90572088b5134/html5/thumbnails/10.jpg)
Triangle.rb MeetupJune 25th, 2012
Cory Foy | @cory_foyhttp://www.coryfoy.comRuby and OO
Classes (and Modules) are Objects
Thursday, June 26, 14
![Page 11: Ruby and OO for Beginners](https://reader033.vdocument.in/reader033/viewer/2022052822/554f3e2bb4c90572088b5134/html5/thumbnails/11.jpg)
Triangle.rb MeetupJune 25th, 2012
Cory Foy | @cory_foyhttp://www.coryfoy.comRuby 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 endend
Thursday, June 26, 14
![Page 12: Ruby and OO for Beginners](https://reader033.vdocument.in/reader033/viewer/2022052822/554f3e2bb4c90572088b5134/html5/thumbnails/12.jpg)
Triangle.rb MeetupJune 25th, 2012
Cory Foy | @cory_foyhttp://www.coryfoy.comRuby 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 endend
Thursday, June 26, 14
![Page 13: Ruby and OO for Beginners](https://reader033.vdocument.in/reader033/viewer/2022052822/554f3e2bb4c90572088b5134/html5/thumbnails/13.jpg)
Triangle.rb MeetupJune 25th, 2012
Cory Foy | @cory_foyhttp://www.coryfoy.comRuby 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 endend
Thursday, June 26, 14
![Page 14: Ruby and OO for Beginners](https://reader033.vdocument.in/reader033/viewer/2022052822/554f3e2bb4c90572088b5134/html5/thumbnails/14.jpg)
Triangle.rb MeetupJune 25th, 2012
Cory Foy | @cory_foyhttp://www.coryfoy.comRuby and OO
Every Expression Evaluates to an Object
Thursday, June 26, 14
![Page 15: Ruby and OO for Beginners](https://reader033.vdocument.in/reader033/viewer/2022052822/554f3e2bb4c90572088b5134/html5/thumbnails/15.jpg)
Triangle.rb MeetupJune 25th, 2012
Cory Foy | @cory_foyhttp://www.coryfoy.comRuby 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 endend
Thursday, June 26, 14
![Page 16: Ruby and OO for Beginners](https://reader033.vdocument.in/reader033/viewer/2022052822/554f3e2bb4c90572088b5134/html5/thumbnails/16.jpg)
Triangle.rb MeetupJune 25th, 2012
Cory Foy | @cory_foyhttp://www.coryfoy.comRuby and OO
It’s All About Sending Messages to Objects
Thursday, June 26, 14
![Page 17: Ruby and OO for Beginners](https://reader033.vdocument.in/reader033/viewer/2022052822/554f3e2bb4c90572088b5134/html5/thumbnails/17.jpg)
Triangle.rb MeetupJune 25th, 2012
Cory Foy | @cory_foyhttp://www.coryfoy.comRuby 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 endend
Thursday, June 26, 14
![Page 18: Ruby and OO for Beginners](https://reader033.vdocument.in/reader033/viewer/2022052822/554f3e2bb4c90572088b5134/html5/thumbnails/18.jpg)
Triangle.rb MeetupJune 25th, 2012
Cory Foy | @cory_foyhttp://www.coryfoy.comRuby and OO
Ruby Basics - Properties• Ruby supports the concept of
Properties (called Attributes)class Move def up @up endend
class Move def up=(val) @up = val endend
move = Move.newmove.up = 15puts move.up #15
Thursday, June 26, 14
![Page 19: Ruby and OO for Beginners](https://reader033.vdocument.in/reader033/viewer/2022052822/554f3e2bb4c90572088b5134/html5/thumbnails/19.jpg)
Triangle.rb MeetupJune 25th, 2012
Cory Foy | @cory_foyhttp://www.coryfoy.comRuby and OO
Ruby Basics - Properties• Ruby also provides convenience
methods for doing thisclass Move attr_accessor :up #Same thing as last slideend
move = Move.newmove.up = 15puts move.up #15
Thursday, June 26, 14
![Page 20: Ruby and OO for Beginners](https://reader033.vdocument.in/reader033/viewer/2022052822/554f3e2bb4c90572088b5134/html5/thumbnails/20.jpg)
Triangle.rb MeetupJune 25th, 2012
Cory Foy | @cory_foyhttp://www.coryfoy.comRuby and OO
Ruby Basics - Properties• You can specify read or write only
attributes as wellclass Move attr_reader :up #Can’t write attr_writer :down #Can’t readend
move = Move.newmove.up = 15 #errord = move.down #error
Thursday, June 26, 14
![Page 21: Ruby and OO for Beginners](https://reader033.vdocument.in/reader033/viewer/2022052822/554f3e2bb4c90572088b5134/html5/thumbnails/21.jpg)
Triangle.rb MeetupJune 25th, 2012
Cory Foy | @cory_foyhttp://www.coryfoy.comRuby 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
![Page 22: Ruby and OO for Beginners](https://reader033.vdocument.in/reader033/viewer/2022052822/554f3e2bb4c90572088b5134/html5/thumbnails/22.jpg)
Triangle.rb MeetupJune 25th, 2012
Cory Foy | @cory_foyhttp://www.coryfoy.comRuby and OO
Ruby Basics - Exceptionsprocess_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
![Page 23: Ruby and OO for Beginners](https://reader033.vdocument.in/reader033/viewer/2022052822/554f3e2bb4c90572088b5134/html5/thumbnails/23.jpg)
Triangle.rb MeetupJune 25th, 2012
Cory Foy | @cory_foyhttp://www.coryfoy.comRuby 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
![Page 24: Ruby and OO for Beginners](https://reader033.vdocument.in/reader033/viewer/2022052822/554f3e2bb4c90572088b5134/html5/thumbnails/24.jpg)
Triangle.rb MeetupJune 25th, 2012
Cory Foy | @cory_foyhttp://www.coryfoy.comRuby 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 publicend
Thursday, June 26, 14
![Page 25: Ruby and OO for Beginners](https://reader033.vdocument.in/reader033/viewer/2022052822/554f3e2bb4c90572088b5134/html5/thumbnails/25.jpg)
Triangle.rb MeetupJune 25th, 2012
Cory Foy | @cory_foyhttp://www.coryfoy.comRuby 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_moveend
Thursday, June 26, 14
![Page 26: Ruby and OO for Beginners](https://reader033.vdocument.in/reader033/viewer/2022052822/554f3e2bb4c90572088b5134/html5/thumbnails/26.jpg)
Triangle.rb MeetupJune 25th, 2012
Cory Foy | @cory_foyhttp://www.coryfoy.comRuby 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 endend
Thursday, June 26, 14
![Page 27: Ruby and OO for Beginners](https://reader033.vdocument.in/reader033/viewer/2022052822/554f3e2bb4c90572088b5134/html5/thumbnails/27.jpg)
Triangle.rb MeetupJune 25th, 2012
Cory Foy | @cory_foyhttp://www.coryfoy.comRuby 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
![Page 28: Ruby and OO for Beginners](https://reader033.vdocument.in/reader033/viewer/2022052822/554f3e2bb4c90572088b5134/html5/thumbnails/28.jpg)
Triangle.rb MeetupJune 25th, 2012
Cory Foy | @cory_foyhttp://www.coryfoy.comRuby 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
![Page 29: Ruby and OO for Beginners](https://reader033.vdocument.in/reader033/viewer/2022052822/554f3e2bb4c90572088b5134/html5/thumbnails/29.jpg)
Triangle.rb MeetupJune 25th, 2012
Cory Foy | @cory_foyhttp://www.coryfoy.comRuby 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)
endend
• How would we validate this in .NET or Java?
Thursday, June 26, 14
![Page 30: Ruby and OO for Beginners](https://reader033.vdocument.in/reader033/viewer/2022052822/554f3e2bb4c90572088b5134/html5/thumbnails/30.jpg)
Triangle.rb MeetupJune 25th, 2012
Cory Foy | @cory_foyhttp://www.coryfoy.comRuby and OO
Ruby Basics – Duck Typing• What is
this?
Thursday, June 26, 14
![Page 31: Ruby and OO for Beginners](https://reader033.vdocument.in/reader033/viewer/2022052822/554f3e2bb4c90572088b5134/html5/thumbnails/31.jpg)
Triangle.rb MeetupJune 25th, 2012
Cory Foy | @cory_foyhttp://www.coryfoy.comRuby and OO
Ruby Basics – Duck Typing• How
about this?
Thursday, June 26, 14
![Page 32: Ruby and OO for Beginners](https://reader033.vdocument.in/reader033/viewer/2022052822/554f3e2bb4c90572088b5134/html5/thumbnails/32.jpg)
Triangle.rb MeetupJune 25th, 2012
Cory Foy | @cory_foyhttp://www.coryfoy.comRuby and OO
Ruby Basics – Duck Typing• What
about this?
Thursday, June 26, 14
![Page 33: Ruby and OO for Beginners](https://reader033.vdocument.in/reader033/viewer/2022052822/554f3e2bb4c90572088b5134/html5/thumbnails/33.jpg)
Triangle.rb MeetupJune 25th, 2012
Cory Foy | @cory_foyhttp://www.coryfoy.comRuby 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
![Page 34: Ruby and OO for Beginners](https://reader033.vdocument.in/reader033/viewer/2022052822/554f3e2bb4c90572088b5134/html5/thumbnails/34.jpg)
Triangle.rb MeetupJune 25th, 2012
Cory Foy | @cory_foyhttp://www.coryfoy.comRuby 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 endend
Thursday, June 26, 14
![Page 35: Ruby and OO for Beginners](https://reader033.vdocument.in/reader033/viewer/2022052822/554f3e2bb4c90572088b5134/html5/thumbnails/35.jpg)
Triangle.rb MeetupJune 25th, 2012
Cory Foy | @cory_foyhttp://www.coryfoy.comRuby 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
![Page 36: Ruby and OO for Beginners](https://reader033.vdocument.in/reader033/viewer/2022052822/554f3e2bb4c90572088b5134/html5/thumbnails/36.jpg)
Triangle.rb MeetupJune 25th, 2012
Cory Foy | @cory_foyhttp://www.coryfoy.comRuby and OO
Advanced Ruby - Blocks• Blocks can be associated with method invocations.
The methods call the block using yielddef 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
![Page 37: Ruby and OO for Beginners](https://reader033.vdocument.in/reader033/viewer/2022052822/554f3e2bb4c90572088b5134/html5/thumbnails/37.jpg)
Triangle.rb MeetupJune 25th, 2012
Cory Foy | @cory_foyhttp://www.coryfoy.comRuby and OO
Advanced Ruby - Blocks• We can check to see if a block was passed to our
methoddef 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 connend
Thursday, June 26, 14
![Page 38: Ruby and OO for Beginners](https://reader033.vdocument.in/reader033/viewer/2022052822/554f3e2bb4c90572088b5134/html5/thumbnails/38.jpg)
Triangle.rb MeetupJune 25th, 2012
Cory Foy | @cory_foyhttp://www.coryfoy.comRuby 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
![Page 39: Ruby and OO for Beginners](https://reader033.vdocument.in/reader033/viewer/2022052822/554f3e2bb4c90572088b5134/html5/thumbnails/39.jpg)
Triangle.rb MeetupJune 25th, 2012
Cory Foy | @cory_foyhttp://www.coryfoy.comRuby and OO
Advanced Ruby - Iteratorsdef fib_up_to(max) i1, i2 = 1, 1 while i1 <= max yield i1 i1, i2 = i2, i1+i2 # parallel assignment endend
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
![Page 40: Ruby and OO for Beginners](https://reader033.vdocument.in/reader033/viewer/2022052822/554f3e2bb4c90572088b5134/html5/thumbnails/40.jpg)
Triangle.rb MeetupJune 25th, 2012
Cory Foy | @cory_foyhttp://www.coryfoy.comRuby and OO
Advanced Ruby - Modules• At their core, Modules are like
namespaces in .NET or Java.module Kite def Kite.fly endend
module Plane def Plane.fly endend
Thursday, June 26, 14
![Page 41: Ruby and OO for Beginners](https://reader033.vdocument.in/reader033/viewer/2022052822/554f3e2bb4c90572088b5134/html5/thumbnails/41.jpg)
Triangle.rb MeetupJune 25th, 2012
Cory Foy | @cory_foyhttp://www.coryfoy.comRuby 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
![Page 42: Ruby and OO for Beginners](https://reader033.vdocument.in/reader033/viewer/2022052822/554f3e2bb4c90572088b5134/html5/thumbnails/42.jpg)
Triangle.rb MeetupJune 25th, 2012
Cory Foy | @cory_foyhttp://www.coryfoy.comRuby and OO
Advanced Ruby - Mixinsmodule Print def print puts “Company Confidential” yield endend
class Document include Print #...end
doc = Document.newdoc.print { “Fourth Quarter looks great!” } -> Company Confidential -> Fourth Quarter looks great!
Thursday, June 26, 14
![Page 43: Ruby and OO for Beginners](https://reader033.vdocument.in/reader033/viewer/2022052822/554f3e2bb4c90572088b5134/html5/thumbnails/43.jpg)
Triangle.rb MeetupJune 25th, 2012
Cory Foy | @cory_foyhttp://www.coryfoy.comRuby 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
![Page 44: Ruby and OO for Beginners](https://reader033.vdocument.in/reader033/viewer/2022052822/554f3e2bb4c90572088b5134/html5/thumbnails/44.jpg)
Triangle.rb MeetupJune 25th, 2012
Cory Foy | @cory_foyhttp://www.coryfoy.comRuby and OO
Advanced Ruby - Reflection• In Ruby, we can just send the
command to the objectmyString = “Test”puts myString.send(:length) # 4
Thursday, June 26, 14
![Page 45: Ruby and OO for Beginners](https://reader033.vdocument.in/reader033/viewer/2022052822/554f3e2bb4c90572088b5134/html5/thumbnails/45.jpg)
Triangle.rb MeetupJune 25th, 2012
Cory Foy | @cory_foyhttp://www.coryfoy.comRuby and OO
Advanced Ruby - Reflection• We can also do all kinds of fancy stuff#print out all of the objects in our systemObjectSpace.each_object(Class) {|c| puts c}
#Get all the methods on an object“Some String”.methods
#see if an object responds to a certain methodobj.respond_to?(:length)
#see if an object is a typeobj.kind_of?(Numeric)obj.instance_of?(FixNum)
Thursday, June 26, 14
![Page 46: Ruby and OO for Beginners](https://reader033.vdocument.in/reader033/viewer/2022052822/554f3e2bb4c90572088b5134/html5/thumbnails/46.jpg)
Triangle.rb MeetupJune 25th, 2012
Cory Foy | @cory_foyhttp://www.coryfoy.comRuby and OO
Sending Can Be Very, Very Bad
Thursday, June 26, 14
![Page 47: Ruby and OO for Beginners](https://reader033.vdocument.in/reader033/viewer/2022052822/554f3e2bb4c90572088b5134/html5/thumbnails/47.jpg)
Triangle.rb MeetupJune 25th, 2012
Cory Foy | @cory_foyhttp://www.coryfoy.comRuby 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
![Page 48: Ruby and OO for Beginners](https://reader033.vdocument.in/reader033/viewer/2022052822/554f3e2bb4c90572088b5134/html5/thumbnails/48.jpg)
Triangle.rb MeetupJune 25th, 2012
Cory Foy | @cory_foyhttp://www.coryfoy.comRuby 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
![Page 49: Ruby and OO for Beginners](https://reader033.vdocument.in/reader033/viewer/2022052822/554f3e2bb4c90572088b5134/html5/thumbnails/49.jpg)
Cory [email protected]
@cory_foy
blog.coryfoy.com
prettykoolapps.com
coryfoy.com
Thursday, June 26, 14