2

我最近试图理解一个 C++ 程序,它是由我认为有函数式编程背景的人编写的:例如,他声明了一个他广泛使用的闭包类,它有点类似于函数式编程中所谓的闭包. 另一个班级被称为警卫,但我还没有完全弄清楚它有什么用处。它似乎附加了某种清理功能。

我看到的唯一一种称为守卫概念的语言是 Erlang,但它与我找到的代码看起来并不相似。C++ 代码的作者可能暗示过这样的概念存在于哪些其他语言中?

4

5 回答 5

6

术语“守卫”在几种函数式语言中的使用方式与在 Erlang 中的使用方式相同,但这种用法似乎不符合您的描述。如果没有看到 C++ 代码,很难真正了解它的意图。

根据您的描述猜测它实现了类似 Haskell's 的东西bracket,它基本上确保在包装函数退出时释放一些资源,即使发生异常也是如此。在 Python 中,人们会使用finally它,在 C++ 中,您通常在堆栈上对象的析构函数中拥有清理代码。

于 2010-01-30T15:40:50.073 回答
6

对我来说,这听起来像是他在使用 RAII。
类构造函数/析构函数用于在异常安全上下文中对称地处理某种形式的资源分配/释放(Java 程序员最终会调用 {},因为析构函数肯定会被调用。)。

这是一个非常常见的 C++ 习惯用法,在现代 C++ 中被广泛使用。

代码是否看起来像这样:

void Plop()
{
     Guard   guard(lock);
     // Do lots of stuff
}

在这里,守卫锁定了构造函数中的锁并解锁了析构函数中的锁。

于 2010-01-30T19:49:13.907 回答
4

一般来说,守卫只是一个结构,需要评估为真才能沿着某些路径继续执行。这个或类似的东西存在于所有有用的图灵完备编程语言中,但可能是如此基本,以至于通常不会单独命名为一个实体。这是 Haskell 中的一个简单示例:

f x
 | x < 0 = -x
 | otherwise = x

这相当于绝对值函数:如果一个数字是负数,则取反以产生其正数;否则,返回传入的相同值。这里有两个守卫:x < 0,当 x 小于零时为真,和otherwise,始终为真。

于 2010-01-30T15:37:49.217 回答
3

Haskell 的 Control.Monad 模块有guard

guard :: MonadPlus m => Bool -> m ()
guard breturn ()如果bTruemzero如果bFalse

例如,要计算每条腿不超过 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

有关正在发生的事情的解释,请参阅我的博客文章可编程分号解释

于 2010-01-30T15:37:30.407 回答
2

计算机科学中的守卫通常指的是指示循环构造应该继续的布尔表达式。例如(请原谅双关语)

for (int i = 0; i < N; ++i)
  /* stuff */

这里,i < N是守卫。

如果没有更多信息,很难更彻底地回答您的问题。

于 2010-01-30T15:37:55.943 回答