Типизация Питона сделана чтобы сказать "мы сделали", а реально сложные кейсы это не решает.
В C# кстати так можно:
using System.Diagnostics.CodeAnalysis;
class Example
{
private int? _a;
[MemberNotNull(nameof(_a))]
public void Init()
{
_a = 1;
}
public void Print()
{
Init();
Console.WriteLine(_a.Value); // Тут мы знаем _a is not null == true
}
}
Как раз передача по умолчанию по перемещению это наиболее лучший вариант.
Передача по ссылке предполагает, что писатель должен думать когда нужно перемещать, а когда нет и не забыть последнее использование переместить для эфективности.
Можно посмотреть как с этим дела обстоят в 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
А про макросы всё верно.
Видимо не посмотрели как сделано в других языках и вышло что вышло.
Обещают поправить в будущем. Надеюсь сделают как полагается с нормальной типизацией и гигиеной.
Есть и альтернативная мнемоника для лёгкого запоминания для неанглоязычных:
eXtract Ze File
Create Ze File
А если это публикуется в автоматическом режиме без участия человека? Как тогда?
Типизация Питона сделана чтобы сказать "мы сделали", а реально сложные кейсы это не решает.
В C# кстати так можно:
Вы изобрели структурную типизацию.
В Python можно выразить через typing.Protocol.
Тут в Питоне не хватает возможностей выразить зависимости.
Как вариант можно сделать свойство и в него всунуть assert.
С dataclass нельзя нормально наследовать несколько классов данных.
Т.е. можно было бы но не реализовали, а теперь и менять чревато.
https://discuss.python.org/t/dataclasses-and-non-dataclasses-inheritance/88840
Вот работа в этом направлении:
https://github.com/rust-lang/rust-project-goals/issues/395
Будем ждать.
А что за вид работы ?
У нас не то что не уволили, а наоборот активно набирают.
Согласен, бывают моменты.
В инструкциях прописываю, чтобы писал нормальные тесты, а то так пишет кабы что :)
А вы просите тестов накидывать по мере работы и дизайны делать. Тогда ломать не будет безудержно без причины.
Справедливости ради в 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