Но это не должно нам помешать разобраться в предмете получше.
Я размышляю так: гуглю RAII и вижу, что RAII это C++ техника, которая.... На других сайтах, RAII не привязывется непосредственно к C++, при этом приводятся примеры на очень даже managed языках.
В целом, думаю, можно говорить, что RAII это не только про плюсы.
Теперь смотрю непосредственно на суть RAII. Суть я вижу в том, что когда объект, представляющий внешний ресурс создан, то он готов к использованию этого внешнего ресурса, а когда мы этот объект лексически упускаем, то внешний ресурс освобождается. Вот тут, наверно, и зарыта собака. К этому я ещё вернусь.
Означает ли, что RAII должен применяться ко ВСЕМ внешним ресурсам? Думаю, что нет. Случаи бывают разные.
Какие есть механизмы ограничения времени жизни?
В C++, Rust и подобных время жизни объекта ограничено лексическим скоупом, после которого вызывается деструктор.
В управляемых языках, время жизни может быть задано в виде лямбды, в которую передаётся объект или в виде thunk с параметром. Так же, может быть специальная конструкция типа try-with-resources.
Все эти механизмы гарантируют аксиому "на время выполнения указанного кода внешний ресурс будет проинициализирован, а после будет освобождён, и управлять этим нельзя или не нужно".
В чём же порылась собака? В том, что объект может "убежать" из лексического скоупа через копирование, ссылки или другие механизмы. Например, я могу положить объект в коллекцию и вернуть её из функции. Что будет с ресурсом? Я не специалист в C++, но догадываюсь, что там можно запретить move конструктор и компилятор просто не даст скопировать объект, а взятый указатель будет невалиден (т.е. объект не сможет убежать из функции).
В t-w-r мы получим просто "закрытый" объект. Он у нас будет, но будет не функциональный.
В лямбдах та же история с закрытым объектом.
Но, поскольку интернет согласен с тем, что RAII это не только про C++, но и про другие языки с другой семантикой, то я считаю, что указанное поведение ("закрытый" объект) вполне в духе RAII.
Никак. Это другой механизм. Так же, как и RAII не запрещает создавать не-RAII объекты. Считай, что порты, получаемые with-output-to-file и open-output-file это разные объекты.
Джавский-же OutputStream можно использовать двояко.
Если это не шуточные вопросы, то примерно все их можно задать любому фотону (например, фотону от Солнца или от монитора).
Единственный разумный вопрос последний. Фотоны от нас "отдаляются". Точнее, всё сильнее смещаются в красную область. Им всё больше и больше пространства приходится преодолевать на пути к нам. Шанс добраться есть не у всех. Горизонт от нас улетает со сверхсветовой скоростью.
Не обязательно на пике. Обычная защитная реакция, все через это проходили. Даннинг-Крюгер это, скорее, про патологию, про яму, из которой человек не может выбраться.
А неофит может дойти до третьего этапа, главное не оставаться на первом вечно.
Чтобы блок кода стал замыканием, ему необходимо "замкнуть" на себя лексически доступные переменные. Если у блока нет свободных переменных или они доступны глобально, то это не замыкание.
Нет, плавающая запятая не потому, что при переводе "теряется точность", а потому, что количества знаков после запятой зависит от экспоненты, в отличие от fixed point, где количество знаков определено заранее. Запятая "плавает".
Если находиться под горизонтом событий, то "центр" будет на горизонте. Т.е. очень грубо говоря, центр будет во всём "небе". Куда ни посмотри, везде центр.
Хорошо, что метод inputMatrix не зависит от потока ввода, а ожидает Scanner. Плохо, что этот метод зависит от потока вывода. Или вынесите весь ввод-вывод из метода или не используйте внешний Scanner.
Количество цифр в учебной программе я бы считал в лоб, через размер строки.
Но это не должно нам помешать разобраться в предмете получше.
Я размышляю так: гуглю RAII и вижу, что RAII это C++ техника, которая.... На других сайтах, RAII не привязывется непосредственно к C++, при этом приводятся примеры на очень даже managed языках.
В целом, думаю, можно говорить, что RAII это не только про плюсы.
Теперь смотрю непосредственно на суть RAII. Суть я вижу в том, что когда объект, представляющий внешний ресурс создан, то он готов к использованию этого внешнего ресурса, а когда мы этот объект лексически упускаем, то внешний ресурс освобождается. Вот тут, наверно, и зарыта собака. К этому я ещё вернусь.
Означает ли, что RAII должен применяться ко ВСЕМ внешним ресурсам? Думаю, что нет. Случаи бывают разные.
Какие есть механизмы ограничения времени жизни?
В C++, Rust и подобных время жизни объекта ограничено лексическим скоупом, после которого вызывается деструктор.
В управляемых языках, время жизни может быть задано в виде лямбды, в которую передаётся объект или в виде thunk с параметром. Так же, может быть специальная конструкция типа try-with-resources.
Все эти механизмы гарантируют аксиому "на время выполнения указанного кода внешний ресурс будет проинициализирован, а после будет освобождён, и управлять этим нельзя или не нужно".
В чём же порылась собака? В том, что объект может "убежать" из лексического скоупа через копирование, ссылки или другие механизмы. Например, я могу положить объект в коллекцию и вернуть её из функции. Что будет с ресурсом? Я не специалист в C++, но догадываюсь, что там можно запретить move конструктор и компилятор просто не даст скопировать объект, а взятый указатель будет невалиден (т.е. объект не сможет убежать из функции).
В t-w-r мы получим просто "закрытый" объект. Он у нас будет, но будет не функциональный.
В лямбдах та же история с закрытым объектом.
Но, поскольку интернет согласен с тем, что RAII это не только про C++, но и про другие языки с другой семантикой, то я считаю, что указанное поведение ("закрытый" объект) вполне в духе RAII.
И GC тут не при чём.
Как-то так.
Ну, поскольку RAII это, скорее, набор техник для конкретного языка, то в сравнении напрямую не вижу большого смысла.
Захватили ресурс в конструкторе, освободили в деструкторе.
Я всё ещё склоняюсь к тому, что GC не мешает RAII.
Никак. Это другой механизм. Так же, как и RAII не запрещает создавать не-RAII объекты. Считай, что порты, получаемые
with-output-to-fileиopen-output-fileэто разные объекты.Джавский-же OutputStream можно использовать двояко.
В яве и c# можно забыть сделать t-w-r, в scheme нет.
Интересно, в Java прямо написано "The Pattern engine performs traditional NFA-based matching with ordered alternation as occurs in Perl 5."
И о каком произвольном коде во время поиска идёт речь?
GC не мешает RAII.
Вот пример RAII из scheme:
(with-output-to-file some-file(lambda () (printf "hello world")))Для чистки ресурсов используются "таможенники" (custodians).
Опять Яндекс Практикум? Сначала Go, теперь вот C++.
Глаз цепляется за каждое утверждение. Некоторые утверждения просто непонятны. Например
array.get(j)Это из какой явы код?Как бенчмаркали Java?
GC не обязан останавливать мир.
GC не мешает RTTI.
Вообще, странный выбор соперников Python и Java.
Если это не шуточные вопросы, то примерно все их можно задать любому фотону (например, фотону от Солнца или от монитора).
Единственный разумный вопрос последний. Фотоны от нас "отдаляются". Точнее, всё сильнее смещаются в красную область. Им всё больше и больше пространства приходится преодолевать на пути к нам. Шанс добраться есть не у всех. Горизонт от нас улетает со сверхсветовой скоростью.
Не обязательно на пике. Обычная защитная реакция, все через это проходили. Даннинг-Крюгер это, скорее, про патологию, про яму, из которой человек не может выбраться.
А неофит может дойти до третьего этапа, главное не оставаться на первом вечно.
Ну это же три стадии профессионализма:
Делать по правилам
Придумывать правила
Нарушать правила
Чтобы блок кода стал замыканием, ему необходимо "замкнуть" на себя лексически доступные переменные. Если у блока нет свободных переменных или они доступны глобально, то это не замыкание.
Поясните, как включение в реестр мешает бесплатности?
Нет, плавающая запятая не потому, что при переводе "теряется точность", а потому, что количества знаков после запятой зависит от экспоненты, в отличие от fixed point, где количество знаков определено заранее. Запятая "плавает".
Остались нераскрытыми вопросы: почему и куда точка плавает? что за видеокарты в 60-70, из-за особенностей вычислений которых игры не работали?
Если находиться под горизонтом событий, то "центр" будет на горизонте. Т.е. очень грубо говоря, центр будет во всём "небе". Куда ни посмотри, везде центр.
Использование /dev/sdb затирает таблицу разделов. Если уж таблица и раздел созданы, то использовать надо /dev/sdb1.
А зачем создавать таблицу разделов, если потом используется весь диск?
Хорошо, что метод
inputMatrix не зависит от потока ввода, а ожидает Scanner. Плохо, что этот метод зависит от потока вывода. Или вынесите весь ввод-вывод из метода или не используйте внешний Scanner.Количество цифр в учебной программе я бы считал в лоб, через размер строки.Только xterm медленнее konsole.
Интересно, как они рендерили до мультфильма "Тачки" без рейтресинга?