2009-07-09 69 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的答案是一個更好的解決方案,但。