На каком языке есть ключевое слово «охрана» или концепция?
-
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
это охранник.
Трудно ответить на ваш вопрос более тщательно без дополнительной информации.