Passing a string slice, returning a string slice. But who owns it?





.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ height:90px;width:728px;box-sizing:border-box;
}







1















I'm a beginner to Rust and just learning the ownership concept.



I'm using this function to reverse a String



fn reverse(input: &str) -> String {
//we are receiving a borrowed value,
input
//get an iterator of chars from the string slice
.chars()
//Goes between two iterators.
//From the doc: double-ended iterator with the direction inverted.
.rev()
//collect into a String
.collect::<String>()
}

fn process_reverse_case(input: &str, expected: &str) {
assert_eq!(&reverse(input), expected)
}

fn main() {
process_reverse_case("robot", "tobor");
}


I would like to understand who owns robot and tobor.




  • I'm passing a borrowed value. Which is a string slice.

  • I understand this can't be modified. So when we are collecting the reversed string, I think we are collecting it into a argument 1 of assert_eq!. Am I right?

  • But as the process of reversing + collection happens inside reverse, the memory needed keeps increasing. Does argument 1 of assert_eq! account for that?

  • The above question might have been solved by the compiler at compile time. Am I right?










share|improve this question































    1















    I'm a beginner to Rust and just learning the ownership concept.



    I'm using this function to reverse a String



    fn reverse(input: &str) -> String {
    //we are receiving a borrowed value,
    input
    //get an iterator of chars from the string slice
    .chars()
    //Goes between two iterators.
    //From the doc: double-ended iterator with the direction inverted.
    .rev()
    //collect into a String
    .collect::<String>()
    }

    fn process_reverse_case(input: &str, expected: &str) {
    assert_eq!(&reverse(input), expected)
    }

    fn main() {
    process_reverse_case("robot", "tobor");
    }


    I would like to understand who owns robot and tobor.




    • I'm passing a borrowed value. Which is a string slice.

    • I understand this can't be modified. So when we are collecting the reversed string, I think we are collecting it into a argument 1 of assert_eq!. Am I right?

    • But as the process of reversing + collection happens inside reverse, the memory needed keeps increasing. Does argument 1 of assert_eq! account for that?

    • The above question might have been solved by the compiler at compile time. Am I right?










    share|improve this question



























      1












      1








      1








      I'm a beginner to Rust and just learning the ownership concept.



      I'm using this function to reverse a String



      fn reverse(input: &str) -> String {
      //we are receiving a borrowed value,
      input
      //get an iterator of chars from the string slice
      .chars()
      //Goes between two iterators.
      //From the doc: double-ended iterator with the direction inverted.
      .rev()
      //collect into a String
      .collect::<String>()
      }

      fn process_reverse_case(input: &str, expected: &str) {
      assert_eq!(&reverse(input), expected)
      }

      fn main() {
      process_reverse_case("robot", "tobor");
      }


      I would like to understand who owns robot and tobor.




      • I'm passing a borrowed value. Which is a string slice.

      • I understand this can't be modified. So when we are collecting the reversed string, I think we are collecting it into a argument 1 of assert_eq!. Am I right?

      • But as the process of reversing + collection happens inside reverse, the memory needed keeps increasing. Does argument 1 of assert_eq! account for that?

      • The above question might have been solved by the compiler at compile time. Am I right?










      share|improve this question
















      I'm a beginner to Rust and just learning the ownership concept.



      I'm using this function to reverse a String



      fn reverse(input: &str) -> String {
      //we are receiving a borrowed value,
      input
      //get an iterator of chars from the string slice
      .chars()
      //Goes between two iterators.
      //From the doc: double-ended iterator with the direction inverted.
      .rev()
      //collect into a String
      .collect::<String>()
      }

      fn process_reverse_case(input: &str, expected: &str) {
      assert_eq!(&reverse(input), expected)
      }

      fn main() {
      process_reverse_case("robot", "tobor");
      }


      I would like to understand who owns robot and tobor.




      • I'm passing a borrowed value. Which is a string slice.

      • I understand this can't be modified. So when we are collecting the reversed string, I think we are collecting it into a argument 1 of assert_eq!. Am I right?

      • But as the process of reversing + collection happens inside reverse, the memory needed keeps increasing. Does argument 1 of assert_eq! account for that?

      • The above question might have been solved by the compiler at compile time. Am I right?







      rust






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 23 '18 at 11:11







      clmno

















      asked Nov 23 '18 at 10:42









      clmnoclmno

      734416




      734416
























          1 Answer
          1






          active

          oldest

          votes


















          5














          Your claims are mostly wrong, let me try to correct them.




          Passing a string slice, returning a string slice




          fn reverse(input: &str) -> String you are accepting a string slice, but returning a String. A String "has ownership over the contents of the string".






          I understand this [a string slice] can't be modified




          You can modify a &mut str, e.g.



          fn to_lower(s: &mut str) {
          s.make_ascii_lowercase();
          }

          fn main() {
          let mut a = String::from("ABC");
          println!("{}", a);
          to_lower(&mut a);
          println!("{}", a);
          }


          (playground)






          So when we are collecting the reversed string, I think we are collecting it into a argument 1 of assert_eq!




          No. You collect it into a string, that is what collect::<String>() is for. Also your function reverse returns a String.

          This means, that you are calling the function reverse, which returns a String and you are passing that String as the first "argument" to the assert_eq! macro.






          the memory needed keeps increasing. Does argument 1 of assert_eq! account for that?




          No, how should it? That's all done inside of the reverse function. assert_eq! just takes two parameters. Where they come from is uncertain and not needed to know.






          assert_eq!(&reverse(input), expected)




          What happens in this line is, that you are calling your reverse function with input as parameter. But normally you can't compare &T with T (a reference to something with an actual instance of something), that's where the & (ampersand) in front of reverse comes into play. String implements the Deref trait which means it can be seen as a str as well (see the doc for Deref). But now you are trying to compare a str with &str, which does not work and that's why you put & in front, so you actually end up with &str and &str which you can compare with ==.






          I would like to understand who ownes robot and tobor.




          Nobody. In fact they live inside of the data section in the ELF/Binary itself. They don't have an owner per se, but can be used as &str wherever needed.






          share|improve this answer


























            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53445132%2fpassing-a-string-slice-returning-a-string-slice-but-who-owns-it%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            5














            Your claims are mostly wrong, let me try to correct them.




            Passing a string slice, returning a string slice




            fn reverse(input: &str) -> String you are accepting a string slice, but returning a String. A String "has ownership over the contents of the string".






            I understand this [a string slice] can't be modified




            You can modify a &mut str, e.g.



            fn to_lower(s: &mut str) {
            s.make_ascii_lowercase();
            }

            fn main() {
            let mut a = String::from("ABC");
            println!("{}", a);
            to_lower(&mut a);
            println!("{}", a);
            }


            (playground)






            So when we are collecting the reversed string, I think we are collecting it into a argument 1 of assert_eq!




            No. You collect it into a string, that is what collect::<String>() is for. Also your function reverse returns a String.

            This means, that you are calling the function reverse, which returns a String and you are passing that String as the first "argument" to the assert_eq! macro.






            the memory needed keeps increasing. Does argument 1 of assert_eq! account for that?




            No, how should it? That's all done inside of the reverse function. assert_eq! just takes two parameters. Where they come from is uncertain and not needed to know.






            assert_eq!(&reverse(input), expected)




            What happens in this line is, that you are calling your reverse function with input as parameter. But normally you can't compare &T with T (a reference to something with an actual instance of something), that's where the & (ampersand) in front of reverse comes into play. String implements the Deref trait which means it can be seen as a str as well (see the doc for Deref). But now you are trying to compare a str with &str, which does not work and that's why you put & in front, so you actually end up with &str and &str which you can compare with ==.






            I would like to understand who ownes robot and tobor.




            Nobody. In fact they live inside of the data section in the ELF/Binary itself. They don't have an owner per se, but can be used as &str wherever needed.






            share|improve this answer






























              5














              Your claims are mostly wrong, let me try to correct them.




              Passing a string slice, returning a string slice




              fn reverse(input: &str) -> String you are accepting a string slice, but returning a String. A String "has ownership over the contents of the string".






              I understand this [a string slice] can't be modified




              You can modify a &mut str, e.g.



              fn to_lower(s: &mut str) {
              s.make_ascii_lowercase();
              }

              fn main() {
              let mut a = String::from("ABC");
              println!("{}", a);
              to_lower(&mut a);
              println!("{}", a);
              }


              (playground)






              So when we are collecting the reversed string, I think we are collecting it into a argument 1 of assert_eq!




              No. You collect it into a string, that is what collect::<String>() is for. Also your function reverse returns a String.

              This means, that you are calling the function reverse, which returns a String and you are passing that String as the first "argument" to the assert_eq! macro.






              the memory needed keeps increasing. Does argument 1 of assert_eq! account for that?




              No, how should it? That's all done inside of the reverse function. assert_eq! just takes two parameters. Where they come from is uncertain and not needed to know.






              assert_eq!(&reverse(input), expected)




              What happens in this line is, that you are calling your reverse function with input as parameter. But normally you can't compare &T with T (a reference to something with an actual instance of something), that's where the & (ampersand) in front of reverse comes into play. String implements the Deref trait which means it can be seen as a str as well (see the doc for Deref). But now you are trying to compare a str with &str, which does not work and that's why you put & in front, so you actually end up with &str and &str which you can compare with ==.






              I would like to understand who ownes robot and tobor.




              Nobody. In fact they live inside of the data section in the ELF/Binary itself. They don't have an owner per se, but can be used as &str wherever needed.






              share|improve this answer




























                5












                5








                5







                Your claims are mostly wrong, let me try to correct them.




                Passing a string slice, returning a string slice




                fn reverse(input: &str) -> String you are accepting a string slice, but returning a String. A String "has ownership over the contents of the string".






                I understand this [a string slice] can't be modified




                You can modify a &mut str, e.g.



                fn to_lower(s: &mut str) {
                s.make_ascii_lowercase();
                }

                fn main() {
                let mut a = String::from("ABC");
                println!("{}", a);
                to_lower(&mut a);
                println!("{}", a);
                }


                (playground)






                So when we are collecting the reversed string, I think we are collecting it into a argument 1 of assert_eq!




                No. You collect it into a string, that is what collect::<String>() is for. Also your function reverse returns a String.

                This means, that you are calling the function reverse, which returns a String and you are passing that String as the first "argument" to the assert_eq! macro.






                the memory needed keeps increasing. Does argument 1 of assert_eq! account for that?




                No, how should it? That's all done inside of the reverse function. assert_eq! just takes two parameters. Where they come from is uncertain and not needed to know.






                assert_eq!(&reverse(input), expected)




                What happens in this line is, that you are calling your reverse function with input as parameter. But normally you can't compare &T with T (a reference to something with an actual instance of something), that's where the & (ampersand) in front of reverse comes into play. String implements the Deref trait which means it can be seen as a str as well (see the doc for Deref). But now you are trying to compare a str with &str, which does not work and that's why you put & in front, so you actually end up with &str and &str which you can compare with ==.






                I would like to understand who ownes robot and tobor.




                Nobody. In fact they live inside of the data section in the ELF/Binary itself. They don't have an owner per se, but can be used as &str wherever needed.






                share|improve this answer















                Your claims are mostly wrong, let me try to correct them.




                Passing a string slice, returning a string slice




                fn reverse(input: &str) -> String you are accepting a string slice, but returning a String. A String "has ownership over the contents of the string".






                I understand this [a string slice] can't be modified




                You can modify a &mut str, e.g.



                fn to_lower(s: &mut str) {
                s.make_ascii_lowercase();
                }

                fn main() {
                let mut a = String::from("ABC");
                println!("{}", a);
                to_lower(&mut a);
                println!("{}", a);
                }


                (playground)






                So when we are collecting the reversed string, I think we are collecting it into a argument 1 of assert_eq!




                No. You collect it into a string, that is what collect::<String>() is for. Also your function reverse returns a String.

                This means, that you are calling the function reverse, which returns a String and you are passing that String as the first "argument" to the assert_eq! macro.






                the memory needed keeps increasing. Does argument 1 of assert_eq! account for that?




                No, how should it? That's all done inside of the reverse function. assert_eq! just takes two parameters. Where they come from is uncertain and not needed to know.






                assert_eq!(&reverse(input), expected)




                What happens in this line is, that you are calling your reverse function with input as parameter. But normally you can't compare &T with T (a reference to something with an actual instance of something), that's where the & (ampersand) in front of reverse comes into play. String implements the Deref trait which means it can be seen as a str as well (see the doc for Deref). But now you are trying to compare a str with &str, which does not work and that's why you put & in front, so you actually end up with &str and &str which you can compare with ==.






                I would like to understand who ownes robot and tobor.




                Nobody. In fact they live inside of the data section in the ELF/Binary itself. They don't have an owner per se, but can be used as &str wherever needed.







                share|improve this answer














                share|improve this answer



                share|improve this answer








                edited Nov 23 '18 at 11:32

























                answered Nov 23 '18 at 11:04









                hellowhellow

                5,44952344




                5,44952344
































                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53445132%2fpassing-a-string-slice-returning-a-string-slice-but-who-owns-it%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    "Incorrect syntax near the keyword 'ON'. (on update cascade, on delete cascade,)

                    Alcedinidae

                    Origin of the phrase “under your belt”?