在什么语言中有“守护”关键字或概念?

时间:2010-01-30 15:30:32

标签: c++ class nomenclature

我最近试图理解一个C ++程序,该程序是由我认为具有函数式编程背景的人编写的:例如,他已经声明了一个 closure 类,他广泛使用并且在某种程度上有所帮助类似于函数式编程中的闭包。另一个班级被称为后卫,但我还没有弄清楚它有什么好处。它似乎附加了某种清理功能。

我看到一个名为 guard 的概念的唯一语言是Erlang,但这并不像我找到的代码那样远程。在其他语言中存在这样一个概念,C ++代码的作者可能提到过吗?

5 个答案:

答案 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 breturn (),则bTrue;如果mzerob,则为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是守卫。

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