2

Is there a better way to achieve the following? It seems a little clunky to list the methods as symbols...

This code runs an init before and draw after for each of the 4 methods. The following code works, but is there a more readable or idiomatic way of doing it?

Class DrawMap
  def draw_method_1
    ...
  end

  def draw_method_2
    ...
  end

  def draw_all
    [:draw_method_1, :draw_method_2, :draw_method_3, :draw_method_4].each do |method|
      init_draw
      send method
      @draw.draw
    end
  end

...

The Rails before and after filters would do the same thing, but this is not a Rails app.

Ruby 1.9.3

B Seven
  • 44,484
  • 66
  • 240
  • 385

1 Answers1

2

If you just want to make the code above a little cleaner, you could try this:

def draw_all
  (1..4).each do |n|
    init_draw
    send "draw_method_#{n}"
    @draw.draw 
  end
end

Otherwise, there is a pretty good SO question right here that would really help you out. It involves a little metaprogramming that basically redefines methods and wraps them with some additional code. In your case, you would wrap with init_draw and draw.

Community
  • 1
  • 1
Kyle
  • 21,978
  • 2
  • 60
  • 61