4. Objects Have State
State is basically data: the value or values that
represent the aspects of the object.
"Hello, World"
# This object has only one piece of state,
# a string of characters spelling "Hello World"
5. Objects Have State
What is the state in a String object?
# A String is an Array of characters
"Hello".chars # => ['H', 'e', 'l', 'l', 'o']
10. How To Write An Object
4 "Class": another name for Object
4 Objects are defined in files
11. How To Write An Object
# File Name: better_string.rb
class BetterString
end
Now we can make a BetterString:
better_string = BetterString.new
12. How To Write An Object
class BetterString
def initialize(base)
end
end
Now we can do:
better_string = BetterString.new("A boring string")
# Oh noes, our base string isn't saved!
better_string.inspect # => "#<BetterString:0x007f8d7c1e6c78>"
13. How To Write An Object
class BetterString
def initialize(base)
# This creates a LOCAL variable, only this method can see it
base = base
# This creates a INSTANCE variable (state)
@base = base
end
end
When you want to save state, use an instance variable.
14. How To Write An Object
class BetterString
def initialize(base)
@base = base
end
end
better_string = BetterString.new("A boring string")
better_string.inspect
# => "#<BetterString:0x007fa633091998 @base="A boring string">"
better_string.base
# ~> -:11:in `<main>': undefined method `base' for #<BetterString ...> (NoMethodError)
# What gives?
16. Getters and Setters
class BetterString
def initialize(base)
@base = base
end
# A getter for the @base variable
def base
@base
end
# A setter for the @base variable
def base=(new_base)
@base = new_base
end
end
23. Review
4 Objects are a combination of state and methods
4 You define classes in files
4 Use @instance methods to save state
4 Use attr_accessible, attr_writer, attr_reader to
make getters and setters
25. Make Strings Awesome-er
class BetterString
# ...
def improve
@base.gsub("boring", "awesome")
end
end
better_string = BetterString.new("A boring string")
better_string.improve # => "A awesome string"
27. Class / Instance Methods
Class: The Platonic definition of the object.
Instance: A version of that object, assigned to a
variable.
28. Class / Instance Methods
BetterString # This is the class
better_string = BetterString.new # This is an instance
# Class methods can be called on the class
BetterString.from_str("Some other string")
# Instance methods can be called on instances
better_string.improve
29. Class / Instance Methods
class BetterString
# This is a class method
def self.from_str(other_string)
BetterString.new(other_string)
end
# This is an instance method
def improve
# ...
end
end
32. Equality
We can "overload" the == operator for BetterString.
class BetterString
# ...
def ==(other_string)
@base == other_string
end
end
normal_string = "A boring string"
better_string = BetterString.new("A boring string")
normal_string == better_string # => true
# Yay!