Skrivet av jclr:
Däremot förstår jag fortfarande inte vad @kik menar med överlagring och varför det är så viktigt?
Bad AI göra en jämförelse mellan std::vector och rusts Vec. Rust behöver normalt nära dubbelt så många olika metodnamn jämfört med C++ på grund av att de saknar överlagring. Det kanske inte upplevs som så problematiskt om man inte är van vid att skriva generell kod eller skriva kod som skall återanvändas.
Men det är problem som ökar snabbt eftersom man hela tiden behöver hitta på nya namn, namn är svåra att hantera.
Ta en jämförelse, låt säga att du har 1000 skruvar till en bil, är det 1000 olika skruvar hade bilen blivit mycket dyr. Desto mer lika du kan få skruvarna desto lättare blir bilen att skruva samman.
Med överlagring är det enklare att ha samma namnuppsättning för olika typer av objekt och då slipper utvecklare läsa igenom koden. Bra namngivning i C++ och du behöver i princip inte läsa kod, du vet hur du skall använda det eftersom det följer mönster (fasta strukturer) och där är namn en viktig del.
Problemet med avsaknad av överlagring blir speciellt jobbigt i värdeklasser. I alla fall har jag inte lyckats få AI att skriva om C++ kod till något som verkar trevligt och jobba med. std::vector som här jämförs är långt ifrån det värsta exemplet, tvärtom
Med det sagt så är rust ett jättebra undervisningsspråk. För nya utvecklare är tydliga namn lättare att förstå jämfört med "smart" C++ kod
***
### Comparison of `std::vector` (C++) and `Vec` (Rust) Method Proliferation
A key difference between the C++ and Rust APIs is the number of method names. C++ leverages function overloading and context, while Rust uses distinct names to explicitly signal mutability, ownership, and error handling.
**Operation: Get an element**
* **C++** (Fewer names): `operator[]`, `at`, `front`, `back`
* **Rust** (More names, explicit): `[]` (via Index trait), `get`, `get_mut`, `first`, `first_mut`, `last`, `last_mut`
**Operation: Add an element**
* **C++:** `push_back`, `emplace_back`
* **Rust:** `push`, `insert`
**Operation: Remove an element**
* **C++:** `pop_back`, `erase`
* **Rust:** `pop`, `remove`, `swap_remove`
**Operation: Create an iterator**
* **C++** (Overloaded names): `begin`, `end` (with `const`, non-`const`, and reverse variants)
* **Rust** (Explicit names): `iter` (immutable borrow), `iter_mut` (mutable borrow), `into_iter` (take ownership)
**Operation: Change size**
* **C++** (Single method): `resize`
* **Rust** (Specific methods): `resize`, `resize_with`
**Operation: Remove elements by condition**
* **C++** (Algorithm + method): Use `std::remove_if` + `erase`
* **Rust** (Built-in methods): `retain`, `drain`, `drain_filter` (unstable)
**Operation: Append another collection**
* **C++** (Overloaded method): `insert` (with iterators)
* **Rust** (Specific methods): `append`, `extend`, `extend_from_slice`
**Operation: Handle errors on access**
* **C++** (Exception handling): `at` (throws an exception on error)
* **Rust** (Type-based handling): `get`, `get_mut` (return an `Option<&T>` type)