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.
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
Ruby and OO for Beginners
1. Ruby and OO
Cory Foy | @cory_foy
http://www.coryfoy.com
Triangle.rb
June 24, 2014
Thursday, June 26, 14
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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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
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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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