Lately I've been looking into ways of DRY-ing up ruby classes. One of the first, and perhaps most scarily powerful, is the class_eval
method.
What does it do?
class_eval
takes in a block or a string and executes it at the class-level. It's that simple!
Is it useful?
Yeah, it's scary useful. Here's an example where I define a bunch of similar methods on a class:
class Person ['age', 'name', 'favorite_color'].each do |attribute| ['with', 'and'].each do |prefix| class_eval %Q( def #{prefix}_#{attribute}(value) @#{attribute} = value self end ) end end def to_s "Name: #@name, Age: #@age, Favorite Color: #@favorite_color" end end me = Person.new. with_name('Michael'). and_age(22). and_favorite_color('Blue') puts me.to_s # => Name: Michael, Age: 22, Favorite Color: Blue
This short little example used class_eval
to define 6 methods on the person class: with_age
, and_age
, with_name
, and_name
, with_favorite_color
and and_favorite_color
! Pretty cool, huh?