На каком языке есть ключевое слово «охрана» или концепция?

StackOverflow https://stackoverflow.com/questions/2168365

  •  24-09-2019
  •  | 
  •  

Вопрос

Я недавно пытался понять программу C ++, которая была написана кем-то, кто предполагал, что имел фон в функциональном программировании: например, он объявил закрытие Класс, который он широко используется, и который несколько напоминает то, что известно как закрытие в функциональном программировании. Другой класс назывался сторожить, но я еще не понял, что это хорошо. Кажется, есть какая-то функциональность очистки к ней.

Единственный язык, в котором я видел концепцию под названием сторожить Эрланг, но это не удаленно похожи на код, который я нашел. В каких других языках существует такая концепция, чтобы автор Кода C ++, возможно, зарегистрирован?

Это было полезно?

Решение

Мне звучит так, будто он использовал Raii.
Конструктор / деструктор класса используется для симметрично обработки некоторой формы распределения / выделения ресурсов в безопасном контексте исключения (какие программисты Java будут вызывать, наконец, как называются.).

Это очень распространенная идиома C ++ и широко распространяется в современном C ++.

Код выглядел так:

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

Здесь охранник блокирует замок в конструкторе и разблокирует замок в деструктор.

Другие советы

Термин «охрана» используется в несколько функциональных языков То, как он используется в Erlang, но это использование, похоже, не соответствует вашему описанию. Не видение кода C ++, трудно действительно знать, что это было предназначено.

Предположение по вашему описанию было бы то, что он реализует что-то вроде Haskell's bracket, что в основном гарантирует, что некоторые ресурсы выделяются, если завершается завершение функции, даже если это произошло исключением. В Python один будет использовать finally Для этого в C ++ у вас обычно есть код очистки в деструкторе объекта на стеке.

В общих чертах, сторожить это просто конструкция, которая должна оценить до истина для выполнения вдоль некоторого пути для продолжения. Это или что-то вроде это существует во всех полезных языках программирования Turging-Comply, но, возможно, настолько основным, что часто не называется отдельно в зависимости от объекта. Вот простой пример в Haskell:

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

Это эквивалентно функции абсолютной ценности: отрицать число, если он негативно производить свой положительный аналог; В противном случае возвращайте одинаковое значение. Здесь есть два охранника: x < 0, что верно, когда X меньше нуля, и otherwise, что всегда правда.

MaSkell's 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

Для объяснения того, что происходит, см. Мое сообщение в блоге Программируемый полусмен.

Охранники в информатике обычно относятся к логическому выражению, которое указывает на то, что петлиная конструкция должна продолжаться. Например (Pardon Pun)

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

Здесь, i < N это охранник.

Трудно ответить на ваш вопрос более тщательно без дополнительной информации.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top