我有很多像这样的方法:
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或其他重要的东西。
答案 0 :(得分: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
答案 1 :(得分: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
答案 2 :(得分: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的答案是一个更好的解决方案。