A struct is Ruby’s convenient way of letting you bundle a bunch of attributes together (complete with accessor methods) without having to define a specific class.
For example I could have:
Employee = Struct.new(:name,:id,:company)
puts "Employee is a class?: "+Employee.is_a?(Class).to_s # =>true
josh = Employee.new("josh",1,"Google")
puts "Josh is an Employee? "+josh.is_a?(Employee).to_s # =>true
With the above, I have defined an Employee class of which josh is an instance.
Subclassing with Struct
In computer science lingo, a subclass is a class that inherits data and properties from another class. Since a Struct is a class in Ruby, we can subclass on it.
But why would we want to do this?
One interesting use case I found is to use it to shorten up class definitions. For instance, here is how you would normally define a class:
Example #1 OriginalCircle Class (normal class definition)
class OriginalCircle
attr_accessor :radius
def initialize(r)
@radius = r
end
def diameter
2*@radius
end
def circle_area
Math::PI*@radius*@radius
end
end
And here is how you would do it using Ruby’s Struct:
Example #2 Circle Class (subclassing with struct)
class Circle < Struct.new(:radius)
def diameter
2*radius
end
def circle_area
Math::PI*radius\*radius
end
end
Notice that by subclassing with a struct (example 2), the “initialize” method is given to you “automagically.”
You also get the accessor method free of charge
So you can do:
c=Circle.new(1)
c.radius = 2
This changes the radius from 1 to 2. Notice I didn’t have to declare “attr_accessor” like I did in example 1.
I think this is pretty nifty. What other nifty or interesting things have you found with Struct? Feel free to share in the comments below.