Окружающие методы Ruby с кодом - PullRequest
1 голос
/ 09 июля 2009

У меня есть множество таких методов:

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 или других тяжелых вещей только для этого.

Ответы [ 3 ]

6 голосов
/ 09 июля 2009

Вам действительно нужна полная: before: after система обратного вызова или вам этого достаточно?

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 голосов
/ 09 июля 2009

Чтобы расширить ответ Веппоса , использование 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 голосов
/ 09 июля 2009
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 }

Я думаю, что это будет сделано (не уверен, что я думаю о блокировке вызова).

Ответ Веппоса - лучшее решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...