Keeping it classy with Struct
You can use
Struct to bundle attributes together using accessor methods without having to write an explicit class. It’s
easy and almost fun.
The original class
I was recently writing a DSL to handle attributes on the fly. My attribute class originally looked something like this:
module CoolThing class Builder class Attribute def initialize(name, options, block) @name = name @options = options @block = block do_some_checks! end def value(klass) klass.instance_exec(&block) end private attr_reader :name, :options, :block def do_some_checks! # do something end end end end
But for some reason I didn’t like that explicit
class Attribute. It felt icky in the way that I was writing it.
The class, but with Struct
module CoolThing class Builder Attribute = Struct.new(:name, :options, :block) do def initialize(*) super(*) do_some_checks! end def value(klass) klass.instance_exec(&block) end private def do_some_checks! # do something end end end end
This gave me the same ability to create a new instance of
Attribute while not having a class definition within a class definition.