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.