我最近试图理解一个C ++程序,该程序是由我认为具有函数式编程背景的人编写的:例如,他已经声明了一个 closure 类,他广泛使用并且在某种程度上有所帮助类似于函数式编程中的闭包。另一个班级被称为后卫,但我还没有弄清楚它有什么好处。它似乎附加了某种清理功能。
我看到一个名为 guard 的概念的唯一语言是Erlang,但这并不像我找到的代码那样远程。在其他语言中存在这样一个概念,C ++代码的作者可能提到过吗?
答案 0 :(得分:6)
术语“guard”在several functional languages中用于Erlang中,但该用法似乎不符合您的描述。如果没有看到C ++代码,就很难真正了解它的用途。
根据您的描述猜测它会实现Haskell的bracket
之类的东西,它基本上确保在包装函数退出时释放一些资源,即使这是由异常发生的。在Python中,可以使用finally
,在C ++中,您通常在堆栈中的对象的析构函数中使用清理代码。
答案 1 :(得分:6)
对我而言,听起来他正在使用RAII 类构造函数/析构函数用于在异常安全上下文中对齐处理某种形式的资源分配/释放(Java程序员最终会调用{},因为保证析构函数被调用。)。
这是一种非常常见的C ++习语,在现代C ++中被广泛使用。
代码看起来像这样:
void Plop()
{
Guard guard(lock);
// Do lots of stuff
}
守护者将锁定在构造函数中并解锁析构函数中的锁。
答案 2 :(得分:4)
一般而言, guard 只是一个需要评估为true的构造,以便沿着某个路径继续执行。这种或类似的东西存在于所有有用的图灵完备编程语言中,但可能是如此基本,通常不作为实体单独命名。这是Haskell中的一个简单示例:
f x
| x < 0 = -x
| otherwise = x
这相当于绝对值函数:否定一个数字,如果它是负数以产生其正对应物;否则,返回传入的相同值。这里有两个警卫:x < 0
,当x小于零时为真,而otherwise
则为真。
答案 3 :(得分:3)
Haskell的Control.Monad模块有guard
:
<强>
guard :: MonadPlus m => Bool -> m ()
强>
如果guard b
为return ()
,则b
为True
;如果mzero
为b
,则为False
。
例如,要计算每条腿不超过25的毕达哥拉斯三元组,你可以使用
triples = do
a <- [1..25]
b <- [a..25]
c <- [b..25]
guard (p a b c)
return (a,b,c)
where
p a b c = a*a + b*b == c*c
有关正在进行的操作的说明,请参阅我的博文A programmable semicolon explained。
答案 4 :(得分:2)
计算机科学中的守卫通常会引用布尔表达式,指示循环结构应该继续。例如(原谅双关语)
for (int i = 0; i < N; ++i)
/* stuff */
在这里,i < N
是守卫。
如果没有更多信息,很难更彻底地回答你的问题。