2009-07-09 6 views
1

У меня есть большое количество способов, как это:Окружающие методы рубиновый с кодом

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 и блоков кода выглядит то, что необходимо и DRY здесь. Поскольку @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 является лучшим решением.

Смежные вопросы