2009-07-09 5 views
1

J'ai un grand nombre de méthodes comme ceci:environnantes méthodes Ruby avec le 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 

Je voudrais créer la fonctionnalité: before_filter et: after_filter ou de toute autre manière que je peux garder ce code le plus sec possible . Je ne veux pas dépendre de Rails ou d'autres trucs lourds seulement pour cela.

Répondre

6

Avez-vous vraiment besoin d'un système complet: avant: après rappel ou est-ce suffisant pour vous?

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

développiez weppos's answer, en utilisant des yield et des blocs de code ressemble à ce qui est nécessaire et DRY ici. Depuis @posIface.data est utilisé dans les deux blocs, vous pouvez effectuer les opérations suivantes DRY davantage:

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 } 

Je pense que cela va le faire (pas sûr du haut de ma tête sur l'appel de bloc).

La réponse de weppos est une meilleure solution.