3

I'm looking for the shorter way to define instance variables inside the initialize method:

class MyClass
  attr_accessor :foo, :bar, :baz, :qux
  # Typing same stuff all the time is boring
  def initialize(foo, bar, baz, qux)
    @foo, @bar, @baz, @qux = foo, bar, baz, qux
  end
end

Does Ruby have any in-build feature which lets to avoid this kind of monkey job?

# e. g.
class MyClass
  attr_accessor :foo, :bar, :baz, :qux
  # Typing same stuff all the time is boring
  def initialize(foo, bar, baz, qux)
    # Leveraging built-in language feature
    # instance variables are defined automatically
  end
end
DreamWalker
  • 1,327
  • 1
  • 11
  • 19

1 Answers1

10

Meet Struct, a tool made just for this!

MyClass = Struct.new(:foo, :bar, :baz, :qux) do
  # Define your other methods here. 
  # Initializer/accessors will be generated for you.
end

mc = MyClass.new(1)
mc.foo # => 1
mc.bar # => nil

I often see people use Struct like this:

class MyStruct < Struct.new(:foo, :bar, :baz, :qux)
end

But this results in one additional unused class object. Why create garbage when you don't need to?

Sergio Tulentsev
  • 226,338
  • 43
  • 373
  • 367