fn main() {
    let s1 = gives_ownership();         // gives_ownership przenosi swoją wartość
                                        // zwracaną do s1

    let s2 = String::from("witaj");     // s2 wchodzi w zakres

    let s3 = takes_and_gives_back(s2);  // s2 zostaje przeniesiona do
                                        // takes_and_gives_back, co przenosi
                                        // również jej wartość zwracaną do s3
} // Tutaj zmienna s3 wychodzi z zakresu i jest porzucana. Zmienna s2 została przeniesiona,
  // więc nie dzieje się nic specjalnego. Zmienna s1 wychodzi z zakresu i jest porzucana.

fn gives_ownership() -> String {             // Zmienna gives_ownership przeniesie swoją
                                             // wartość zwracaną do funkcji,
                                             // która ją wywołuje

    let some_string = String::from("Twój"); // some_string comes wchodzi w zakres

    some_string                              // Zmienna some_string jest zwracana
                                             // i przenoszona do funkcji wywołującej
}

// Ta funkcja przyjmuje String i zwraca String
fn takes_and_gives_back(a_string: String) -> String { // a_string wchodzi w zakres

    a_string  // Zmienna a_string jest zwracana i przenoszona do funkcji wywołującej
}
