Как раз передача по умолчанию по перемещению это наиболее лучший вариант.
Передача по ссылке предполагает, что писатель должен думать когда нужно перемещать, а когда нет и не забыть последнее использование переместить для эфективности.
Можно посмотреть как с этим дела обстоят в C++ и убедиться, что это неудобно и создаёт ошибки при использовании после перемещения.
struct A {}
fn x(a : A) {}
fn main() {
let a = A {};
x(a);
x(a);
}
error[E0382]: use of moved value: a --> src/main.rs:11:7 | 8 | let a = A {}; | - move occurs because a has type A, which does not implement the Copy trait 9 | 10 | x(a); | - value moved here 11 | x(a); | ^ value used here after move
А когда мы хотим ссылку, то есть заимствевоние то пишем об этом явно
struct A {}
fn x(a : &A) {}
fn main() {
let a = A {};
x(&a);
x(&a);
}
Внезапным исключением являются "методы", где компилятор за нас умеет ставить заимствевование
trait IA {
fn x(self: &mut Self);
fn y(self: &Self);
}
struct A {}
impl IA for A {
fn x(self: &mut Self) {}
fn y(self: &Self) {}
}
fn main() {
let mut a = A {};
a.x();
a.x();
a.y();
a.y();
}
Ну и конечно если мы перемещаем, то не соберёться
trait IA {
fn x(self: Self);
}
struct A {}
impl IA for A {
fn x(self: Self) {}
}
fn main() {
let a = A {};
a.x();
a.x();
}
error[E0382]: use of moved value: a --> src/main.rs:15:5 | 12 | let a = A {}; | - move occurs because a has type A, which does not implement the Copy trait 13 | 14 | a.x(); | --- a moved due to this method call 15 | a.x(); | ^ value used here after move
А про макросы всё верно.
Видимо не посмотрели как сделано в других языках и вышло что вышло.
Обещают поправить в будущем. Надеюсь сделают как полагается с нормальной типизацией и гигиеной.
Справедливости ради в TS/JS наследование это всего лишь удобство синтаксиса.
На деле мы можем как и раньше менять прототипы и использовать defineObject.
Также и с методами их можно отдельно писать как и делали раньше.
Просто это достало ;)
Идея интересная но это как бы подмножество языка получается.
Кстати, Rust не sound это значит, что можно и в безопасном коде написать код с проблемой безопасности.
Странное требование.
Ведь любой unsafe можно закопать в “безопасную” функцию.
А нужно на явный неявный?
Транзитивный вызов учитывается ?
Положим Rc использует внутри unsafe, им можно пользоваться ?
Как раз передача по умолчанию по перемещению это наиболее лучший вариант.
Передача по ссылке предполагает, что писатель должен думать когда нужно перемещать, а когда нет и не забыть последнее использование переместить для эфективности.
Можно посмотреть как с этим дела обстоят в C++ и убедиться, что это неудобно и создаёт ошибки при использовании после перемещения.
А когда мы хотим ссылку, то есть заимствевоние то пишем об этом явно
Внезапным исключением являются "методы", где компилятор за нас умеет ставить заимствевование
https://play.rust-lang.org/?version=stable&mode=debug&edition=2024&gist=a0919eb2079c6a9c2b5508998159eebf
Ну и конечно если мы перемещаем, то не соберёться
А про макросы всё верно.
Видимо не посмотрели как сделано в других языках и вышло что вышло.
Обещают поправить в будущем.
Надеюсь сделают как полагается с нормальной типизацией и гигиеной.
При создании вектора тоже надо указать тип. Тут нет в этом различия.
Да ещё одна функция. Но в стандарт не может предусмотреть на все случаи жизни. У нас будет книга на тысячи страниц тогда.
Насчёт holds_alternative, тут можно было бы сделать, но тогда в шаблонных классах пришлось бы писать v.template holds_alternative<T>.
Это ещё сложнее понять. К тому же есть свободные функции как get.
То, что можно сделать функций вспомогателем не будет в стандарте без серьёзных аргументов.
А вот с таскаи, да беда.
Есть пару попыток сделать нормально, но пока нет заинтересованности больших компаний видимо не будет продвижения.
https://github.com/lewissbaker/cppcoro
https://github.com/David-Haim/concurrencpp
В MSVC вообще есть свой Concurrency Runtime ( https://learn.microsoft.com/en-us/cpp/parallel/concrt/concurrency-runtime )
А код на модули переведут ? ;)
C++20 modules support is still experimental and needs to be
enabled with @option{-fmodules} option.
В том и дело, что стандарт и реальность не просто различаются, а вообще разные миры.
У нас каждый конкретный компилятор в конкретной версии реализуют какую-то часть каких-то стандартов.
В итоге мы не можем просто взять и ориентироваться полностью на стандарт даже если этого хотим.
А если возвращать итераторы то можно просто использовать их сразу в алгоритме.
erase(find(c ,p), c.end())
Как вариант можно было сразу работать везде с отрезками как в D:
https://dlang.org/library/std/range.html
https://www.informit.com/articles/printerfriendly/1407357
Откройте std::ranges алгоритмы.
Как раз то, что просили без итераторов
https://en.cppreference.com/w/cpp/algorithm/ranges/find.html
Купил 5-ю года полтора назад.
Звук хороший, шумоподавление отличное.
Из разочарования музыка в ютьбюбе оказалось такой же качественной как в спотифай. Может из-за айфона нет разницы.
Там когда-то начали рекламу пихать или что там было.
Ушёл на freedownloadmanager и с тех пор если надо скачать пользуюсь им.
Как минимум в благодарность за бесплатное пользование можно и открыть тикет https://github.com/doublecmd/doublecmd/issues
Для сравнения папок я привык к BeyondCompare , коллеги Meld.
А ещё в VSCode тоже есть расширение.
Клавиши все настраиваются.
Скажем в Маке какое-то странное по умолчанию сделано.
Зато бесплатный , с открытым кодом и кроссплатформенный.
Ну и ещё поддерживает все плагины TotalCommander.
А что там кривенького? Я перешёл давно и не заметил, чтобы что-то, что мне надо не работало.
Как не вспомнить это выступление https://youtu.be/aHaBH4LqGsI
Забыли упомянуть ohmybash https://github.com/ohmybash/oh-my-bash
Scala implicit.
Улучшенный в 3.0 https://www.baeldung.com/scala/scala-3-implicit-redesign
Ну так ИИ и ревьют.
Иначе то, что ИИ генерирует я бы без переписывания в продакшн так не пускал.
Да, есть off-heap. Но нет удобств как указатели и Span-ы.
А почему не рассматривался C# ?
Современный .NET позволяет даже работать напрямую с памятью с нулевым оверхедом.