DevEnv
2019-01-07 10:48

Siema, wracamy z kolejnym postem o #RUST. Tym razem na tapet bierzemy Moving Ownership. Zapraszamy! ;)

#Devenv #technicalblog #blog

Patryk27

Typy złożone, których rozmiar może nie być znany na etapie kompilacji, np: klasy, struktury (...)

Warto doprecyzować, że w Ruście nie ma klas - istnieje mechanizm traits, lecz bliżej mu interfejsów znanych z Javy (zwłaszcza biorąc pod uwagę blanket impls występujące w obydwu językach) niż klas.

W przypadku typów złożonych użycie operatora przypisania spowoduje przeniesienie własności (wcześniej wspomniany Moving Ownership).

Operator = spowoduje wykonanie kopii wtedy, gdy dany typ (dowolny!) implementuje Copy - nie ma to nic wspólnego z rodzajem typu, bo np. takie struktury mogą bez przeszkód implementować Copy: https://play.rust-lang.org/?v[...]d2a812a37084bd552e47ee3cacc16 (zauważ, że moje Struct nie jest typem prostym oraz nie zostało tutaj wykonane przeniesienie, a właśnie automatyczna kopia).

Chyba że poprzez typ prosty rozumiesz właśnie taki typ, który jest Copy - przy czym zwyczajowo konwencja nazywania typów w językach wygląda inaczej (prymitywy = int, char itd., typy złożone = struktury itd.).

Musimy jednak stworzyć odpowiednie funkcje, które to realizują, lub wykorzystać dziedziczenie.

Co macie na myśli poprzez wykorzystać dziedziczenie?

IMO warto pokazać sposób na przekazanie struktury do funkcji bez jej przeniesienia (z wykorzystaniem referencji) - aktualnie artykuł zdaje się sugerować, że każde przypisanie / przekazanie zmiennej powoduje jej przeniesienie.

Wartym wspomnienia jest też fakt, że istnieją w Ruście odpowiednie mechanizmy pozwalające na "dzielenie się zmiennymi z wieloma odbiorcami" - np. Rc, Arc, Mutex czy Cell.

Patryk27

Przez jakiś bug nie mogę zmodyfikować mojego postu, a wypadałoby dorzucić inną ważną informację: każda struktura w Ruście ma z góry określony, znany w trakcie kompilacji rozmiar (w odniesieniu do pierwszego cytowanego przeze mnie wyżej fragmentu). Typami odbiegającymi od tego są jedynie traity i slice'y (https://doc.rust-lang.org/nomicon/exotic-sizes.html).

DevEnv

Dzięki @Patryk27.

  • W Rust nie ma słówka kluczowego class, ale jakoś struktura, która implementuje traity lub własne funkcje jest dla mnie klasą. Reprezentuje dane wraz z zachowaniami.
    Trait to jest deklaracja interfejsu podobna do tych z C# lub Javy, ale nie identyczna.

  • Miałem to rozdzielone, bo to o czym wspominasz czyli implementacja trait Copy opisana była poniżej. Podkreśliłem to bardziej.

  • Typy proste to prymitywy. Typy złożone to struktury.

  • Co macie na myśli poprzez wykorzystać dziedziczenie? Zmieniłem by było jasno wypisane, że chodzi o implementacje konkretnego traita a nie o całe zjawisko dziedziczenia.

  • W kolejnych częściach planuje opisać: Borrowing, wpływ mutowalności, slice. Nie chciałem naraz wprowadzać dużej ilości pojęć. Dodałem zdanie zapowiadające by czytelnik wiedział.

  • Rc, Arc, Mutex planuje wprowadzić dopiero w późniejszych częściach, bo to są mechanizmy skierowane na współbieżność.

Dzięki za feedback i pomoc :)