2009-07-09 33 views
1

我有这样一个伟大的一些方法:围绕Ruby方法的代码

def enableMotors 
    @posIface.Lock 1 
    @posIface.data.cmdEnableMotors = 1 
    @posIface.Unlock 
end 

def goTo (pos) 
    @posIface.Lock 1 
    @posIface.data.cmdVelocity.pos = pos 
    @posIface.Unlock 
end 

我想创建功能:的before_filter和:after_filter或任何其他方式我能保持这样的代码尽可能干燥。 我不想只依赖于Rails或其他重量级的东西。

回答

6

你真的需要一个完整的:前:回调后系统或者这足够你?

def with_lock(&block) 
    @posIface.Lock 1 
    yield 
    @posIface.Unlock 
end 

def enableMotors 
    with_lock { @posIface.data.cmdEnableMotors = 1 } 
end 

def goTo (pos) 
    with_lock { @posIface.data.cmdVelocity.pos = pos } 
end 
2

要扩大weppos's answer,利用yield和代码块看起来像什么是必要的,这儿气候干燥。由于@posIface.data在两个块中,你可以做以下进一步晾干:

def with_lock(&block) 
    @posIface.Lock 1 
    yield @posIface.data 
    @posIface.Unlock 
end 

def enableMotors 
    with_lock { |obj| obj.cmdEnableMotors = 1 } 
end 

def goTo (pos) 
    with_lock { |obj| obj.cmdVelocity.pos = pos } 
end 
0
def self.locked_def(name, &b) 
    instance_eval do 
    define_method(name) do 
     @posIface.Lock 1 
     b.call 
     @posIface.UnLock 
     end 
    end 
end 

locked_def :pos { @posIface.data.cmdVelocity.pos = pos } 

我认为这将做到这一点(不知道把我的头对块调用的顶部)。

weppos的答案是一个更好的解决方案,但。