patternrubyrailsModerate
using method missing to reduce the code in ruby
Viewed 0 times
themethodrubyreduceusingmissingcode
Problem
I have a set of Class methods which is :
Since all the methods call self.first.atttibute where attribute is the same name as function name. I think we can reduce this to a single method. Something like method_missing is there in Ruby , but since I am not very good at meta programming , I am seeking advise here.
class << self
def increment_value
self.first.increment_value
end
def max_work_hours_per_day
self.first.max_work_hours_per_day
end
def fast_completion_day
self.first.fast_completion_day
end
def super_fast_completion_day
self.first.super_fast_completion_day
end
def ludicrous_completion_day
self.first.ludicrous_completion_day
end
def budget_completion_day
self.first.budget_completion_day
end
endSince all the methods call self.first.atttibute where attribute is the same name as function name. I think we can reduce this to a single method. Something like method_missing is there in Ruby , but since I am not very good at meta programming , I am seeking advise here.
Solution
Ruby already has a module which allows you to forward specific methods to a given object in its standard library: the Forwardable module.
Using it you can write code like this:
I think spelling out the methods you want to forward like this is preferable to simply forwarding everything as it won't accidentally forward something you don't want to forward. It also does not affect the error message when calling a method that does not exist.
Using it you can write code like this:
class << self
extend Forwardable
def_delegators :first, :increment_value, :max_work_hours_per_day #...
endI think spelling out the methods you want to forward like this is preferable to simply forwarding everything as it won't accidentally forward something you don't want to forward. It also does not affect the error message when calling a method that does not exist.
Code Snippets
class << self
extend Forwardable
def_delegators :first, :increment_value, :max_work_hours_per_day #...
endContext
StackExchange Code Review Q#4253, answer score: 13
Revisions (0)
No revisions yet.