Пришел к следующему выводу, во всех случаях, когда все под вашем контролем, и вы можете уверено гарантировать правильность использования указателей, (например когда это часть внутренней кухни вашей библиотеки)
использование сырых *const T and *mut T не только вредно, но и полезно.
особенно это касается static переменных.
а вот внешние интерфейсы, где возможны не подконтрольные вариации, наоборот использование *const T and *mut T лучше избегать
вот такое “открытие” нуба.
было бы интересно услышать возражения,
если у кого нибудь есть какие-то подобные, очевидно-не очевидные, наблюдения… делитесь
Весь мой опыт толсто намекает мне, что чего-то нетривиальное уверенно гарантировать, если компилятор (или еще что автоматическое) меня не подстраховывает, я не особо могу. Даже если речь идет чисто о внутренностях какой-то моей библиотеки. Использование сырых указателей лишает львиной доли преимуществ ржавчины, так что если без них реально решить поставленную задачу, то лучше их и не расчехлять лишний раз.
использование сырых *const T and *mut T … полезно … особенно это касается static переменных.
Тут хочется подробнее про решаемую задачу и сравнение с безопасным вариантом.
static - поскольку они существуют все время работы программы И это
либо однопоточное приложение (что бывает часто)
либо этот статик упрятан в локальное хранилище потока, если приложение многопоточное.
просто я написал код и наличие проверок вынуждало делать кучу оберток, которые просто не нужны… лишком все тривиально.
переписал на указателях - код существенно упростился.
А нет!
Не понимаю почему в плейграунде этот код компилируется, но у меня такая ошибка:
error[E0499]: cannot borrow `cursor.0` as mutable more than once at a time
--> config/src/lib.rs:142:37
|
142 | if let Value::Array(ref mut array) = cursor {
| ^^^^^^^^^^^^^ mutable borrow starts here in previous iteration of loop
...
201 | }
| - mutable borrow ends here
error[E0506]: cannot assign to `cursor` because it is borrowed
--> config/src/lib.rs:151:21
|
142 | if let Value::Array(ref mut array) = cursor {
| ------------- borrow of `cursor` occurs here