2009-07-09 15 views
1

ich eine große Anzahl von Methoden wie diese:Umgebung Ruby-Methoden mit Code

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 

würde Ich mag erstellen Funktionalität: before_filter und: after_filter oder irgendeine andere Weise, die ich so trocken wie möglich, diesen Code zu halten . Ich möchte mich nicht nur auf Rails oder andere schwere Sachen verlassen.

Antwort

6

Benötigen Sie wirklich ein vollständiges: vor: nach dem Rückrufsystem oder ist das genug für Sie?

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

Um auf weppos's answer zu erweitern, die Verwendung von yield und Codeblöcke machen sieht aus wie, was hier notwendig und trocken ist. Da @posIface.data in beiden Blöcken verwendet wird, können Sie die folgende tun es weiter trocken:

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 } 

denke ich, dass es tun wird (nicht sicher, aus der Spitze von meinem Kopf über den Bausteinaufruf).

Die Antwort von weppos ist jedoch eine bessere Lösung.

Verwandte Themen