Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Brand Logo

agnos.is Forums

  1. Home
  2. Programmer Humor
  3. Learning to program in rust

Learning to program in rust

Scheduled Pinned Locked Moved Programmer Humor
programmerhumor
53 Posts 31 Posters 3 Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • K [email protected]

    This is my experience every time I return to learning rust. I’m guessing that if I used it more often than once a quarter with hobby projects I’d stop falling into the same traps.

    B This user is from outside of this forum
    B This user is from outside of this forum
    [email protected]
    wrote on last edited by
    #24

    I find that the error messages themselves are a great tool for learning when it comes to Rust.

    K 1 Reply Last reply
    8
    • B [email protected]

      I find that the error messages themselves are a great tool for learning when it comes to Rust.

      K This user is from outside of this forum
      K This user is from outside of this forum
      [email protected]
      wrote on last edited by
      #25

      Eh, I’m not entirely sold on that idea.

      I think they do a good job of pointing out “this is a behavior/feature of Rust you need to understand.” However they can send you down the wrong path of correction.

      The compiler error mentioning static lifetime specifiers of &str demonstrates both. It indicates to the developer that ownership and scopes will play a significant role when defining and accessing data. The error though will guide them towards researching how to define static lifetimes and possibly believe that they will need to set this in their functions and structs. Each time you look at questions about this error in places like Stack Overflow with example code you’ll find suggested solutions explaining that a manually-defined static lifetime isn’t necessary to resolve the problem.

      1 Reply Last reply
      2
      • K [email protected]

        This is my experience every time I return to learning rust. I’m guessing that if I used it more often than once a quarter with hobby projects I’d stop falling into the same traps.

        E This user is from outside of this forum
        E This user is from outside of this forum
        [email protected]
        wrote on last edited by
        #26

        Yeah, these become a lot less relevant with routine.

        • Avoiding the main-thread panicking is mostly just a matter of not using .unwrap() and .expect().

        • String vs. &str can mostly be solved by generally using owned datatypes (String) for storing in structs and using references (&str) for passing into function parameters. It does still happen that you forget the & at times, but that's then trivial to solve (by just adding the &).

        • "temporary value dropped while borrowed" can generally be avoided by not passing references outside of your scope/function. You want to pass the owned value outside. Clone, if you have to.

        • "missing lifetime specifier" is also largely solved by not storing references in structs.

        K 1 Reply Last reply
        6
        • S [email protected]

          Can't resist pointing out how you should actually write the function in a "real" scenario (but still not handling errors properly), in case anyone wants to know.

          If the list is guaranteed to have exactly two elements:

          fn is_second_num_positive_exact(input: &str) -> bool {
              let (_, n) = input.split_once(',').unwrap();
              n.parse::<i32>().unwrap() > 0
          }
          

          If you want to test the last element:

          fn is_last_num_positive(input: &str) -> bool {
              let n = input.split(',').next_back().unwrap();
              n.parse::<i32>().unwrap() > 0
          }
          

          If you want to test the 2nd (1-indexed) element:

          fn is_second_num_positive(input: &str) -> bool {
              let n = input.split(',').nth(1).unwrap();
              n.parse::<i32>().unwrap() > 0
          }
          
          B This user is from outside of this forum
          B This user is from outside of this forum
          [email protected]
          wrote on last edited by [email protected]
          #27

          Even better to use expect with a short message of what the assumption is: "the string should contain a comma" if it ever panics you'll know exactly why.

          1 Reply Last reply
          2
          • E [email protected]

            Yeah, these become a lot less relevant with routine.

            • Avoiding the main-thread panicking is mostly just a matter of not using .unwrap() and .expect().

            • String vs. &str can mostly be solved by generally using owned datatypes (String) for storing in structs and using references (&str) for passing into function parameters. It does still happen that you forget the & at times, but that's then trivial to solve (by just adding the &).

            • "temporary value dropped while borrowed" can generally be avoided by not passing references outside of your scope/function. You want to pass the owned value outside. Clone, if you have to.

            • "missing lifetime specifier" is also largely solved by not storing references in structs.

            K This user is from outside of this forum
            K This user is from outside of this forum
            [email protected]
            wrote on last edited by
            #28

            The last two points are the kind of design advice I need to see. I’m probably so used to the C/C++ concept of passing by reference to prevent copies of complex data being generated that I forget how Rust’s definition of a reference is different.

            1 Reply Last reply
            4
            • K [email protected]
              This post did not contain any content.
              D This user is from outside of this forum
              D This user is from outside of this forum
              [email protected]
              wrote on last edited by
              #29

              Call me a weirdo but the more errors a compilers give me the happier (albeit a bit frustrated) I am.
              That stuff generally surfaces in a way or another… and I prefer at compile time 🙂

              That said I haven’t spent quality time with Rust yet… so not sure if there are a lot of nitpicks (ala go) or these are valgrind-level of “holy s*** I am so grateful to this tool” 😃

              itslilith@lemmy.blahaj.zoneI 1 Reply Last reply
              28
              • K [email protected]
                This post did not contain any content.
                E This user is from outside of this forum
                E This user is from outside of this forum
                [email protected]
                wrote on last edited by [email protected]
                #30

                In my experience rust compiler simply moves the errors to earlier stage of development. With rust I write something and get bunch of errors right in the IDE. I spend some time fixing those and when all the compilation errors are gone in 99% of cases the code works and does what it's supposed to do.

                With other languages I write some code and the compiler/interpreter says it's all good. I then run it, get bunch of errors and have to do some debugging, move back and forth between the editor and the command line/browser/application and fix all the bugs one by one.

                So yeah, rust compiler complains a lot but it's to make your life easier, not harder. For me working rust way is just much more pleasant. I get immediate visual clues about the errors right in the IDE. When I finally get it right and all the errors dispersal it's like solving a small puzzle. You know you got it and it feels good. With other languages you think you got it all the time only to find another bug when you run it. Doing it this way is much more frustrating.

                1 Reply Last reply
                12
                • D This user is from outside of this forum
                  D This user is from outside of this forum
                  [email protected]
                  wrote on last edited by [email protected]
                  #31

                  You can also use a shorter version .clone();

                  1 Reply Last reply
                  0
                  • M [email protected]

                    The amount of people on the internet seriously complaining that both Rust error handling sucks and that .unwrap(); is too verbose is just staggering.

                    W This user is from outside of this forum
                    W This user is from outside of this forum
                    [email protected]
                    wrote on last edited by [email protected]
                    #32

                    I’ll be honest, when I was learning to program in Java I mostly just wrapped errors in an empty try catch to shut them up, with no regard for actually handling them.

                    I assume most other learners do that too.

                    M 1 Reply Last reply
                    2
                    • W [email protected]

                      I’ll be honest, when I was learning to program in Java I mostly just wrapped errors in an empty try catch to shut them up, with no regard for actually handling them.

                      I assume most other learners do that too.

                      M This user is from outside of this forum
                      M This user is from outside of this forum
                      [email protected]
                      wrote on last edited by
                      #33

                      Java requiring you to write every exception that can happen in your code isn't helpful.

                      Explicit error types are great, but Java managed to make them on a way where you get almost none of the upside and is so full of downsides that indoctrinated a generation into thinking knowing your errors is bad.

                      1 Reply Last reply
                      2
                      • K [email protected]
                        This post did not contain any content.
                        L This user is from outside of this forum
                        L This user is from outside of this forum
                        [email protected]
                        wrote on last edited by [email protected]
                        #34

                        The old school method of learning a programming language, database, framework or whatever was to read books and take classes, do a series of exercises that teach you how to use the features, and the errors you get if you don't do it right. Then you write code that way for like 10-15 years.

                        The Information Age method is to find some sample code, copypaste into an editor and hit Compile, then paste compile errors into google and fix them until there are no more. Then hit Run and copypaste/fix runtime errors until there are no more runtime errors. Old-schoolers used to call this hacking, but now it's called not having time to deeply learn the hot new thing because before you do you'll have to start over with the next hot new thing.

                        B S 2 Replies Last reply
                        11
                        • D [email protected]

                          Call me a weirdo but the more errors a compilers give me the happier (albeit a bit frustrated) I am.
                          That stuff generally surfaces in a way or another… and I prefer at compile time 🙂

                          That said I haven’t spent quality time with Rust yet… so not sure if there are a lot of nitpicks (ala go) or these are valgrind-level of “holy s*** I am so grateful to this tool” 😃

                          itslilith@lemmy.blahaj.zoneI This user is from outside of this forum
                          itslilith@lemmy.blahaj.zoneI This user is from outside of this forum
                          [email protected]
                          wrote on last edited by
                          #35

                          The borrow checker makes things a bit more complicated to get running, definitely takes some getting used to when you come from a non-memory safe language. But the compiler is really helpful throughout almost all mistakes, often directly providing an explanation and a suggested fix. One of my favorites programming experiences so far

                          Q 1 Reply Last reply
                          3
                          • P [email protected]

                            You mean mutex? Arc allows synchronous read only access by multiple threads, so it's not a performance bottleneck. Locking a mutex would be one.

                            tatterdemalion@programming.devT This user is from outside of this forum
                            tatterdemalion@programming.devT This user is from outside of this forum
                            [email protected]
                            wrote on last edited by
                            #36

                            Arc is not free, and the extra atomic operations + heap allocations can become a bottleneck.

                            P 1 Reply Last reply
                            2
                            • itslilith@lemmy.blahaj.zoneI [email protected]

                              The borrow checker makes things a bit more complicated to get running, definitely takes some getting used to when you come from a non-memory safe language. But the compiler is really helpful throughout almost all mistakes, often directly providing an explanation and a suggested fix. One of my favorites programming experiences so far

                              Q This user is from outside of this forum
                              Q This user is from outside of this forum
                              [email protected]
                              wrote on last edited by [email protected]
                              #37

                              ...definitely takes some getting used to when you come from a non-memory safe language...

                              I actually think it's more like the opposite. The compiler takes the normal rules you apply to avoid issues with a non-memory safe language like C/C++ and enforces them explicitly where memory safe languages don't have those rules at all. I think lifetimes are much more confusing if you've never dealt with a user after free and usually let GC deal with it.

                              Also yes the compiler warnings and errors are amazing, the difference between rustc and gcc is night and day.

                              L 1 Reply Last reply
                              5
                              • L [email protected]

                                The old school method of learning a programming language, database, framework or whatever was to read books and take classes, do a series of exercises that teach you how to use the features, and the errors you get if you don't do it right. Then you write code that way for like 10-15 years.

                                The Information Age method is to find some sample code, copypaste into an editor and hit Compile, then paste compile errors into google and fix them until there are no more. Then hit Run and copypaste/fix runtime errors until there are no more runtime errors. Old-schoolers used to call this hacking, but now it's called not having time to deeply learn the hot new thing because before you do you'll have to start over with the next hot new thing.

                                B This user is from outside of this forum
                                B This user is from outside of this forum
                                [email protected]
                                wrote on last edited by
                                #38

                                Books, classes, and documentation can also be lacking for new tech.

                                1 Reply Last reply
                                4
                                • E [email protected]

                                  The thing with OOP, particularly how it's used in GCed languages, is that it's all about handing references out to wherever and then dealing with the complexity of not knowing who has access to your fields via getters & setters, or by cloning memory whenever it's modified in asynchronous code.

                                  Rust has quite the opposite mindset. It's all about tracking where references go. It pushes your code to be very tree-shaped, i.e. references typically¹ only exist between a function and the functions it calls underneath. This is what allows asynchronous code to be safe in Rust, and I would also argue that the tree shape makes code easier to understand, too.

                                  But yeah, some of the patterns you might know from OOP will not work in Rust for that reason. You will likely need to get into a different mindset over time.

                                  Also just in case: We are talking OOP in the sense of the paradigm, i.e. object-oriented.
                                  Just using objects, i.e. data with associated functions/methods, that works completely normal in Rust.

                                  ¹) If you genuinely need references that reach outside the tree shape, which is mostly going to be the case, if you work with multiple threads, then you can do so by wrapping your data structures in Arc<Mutex<_>> or similar. But yeah, when learning, you should try to solve your problems without these. Most programs don't need them.

                                  B This user is from outside of this forum
                                  B This user is from outside of this forum
                                  [email protected]
                                  wrote on last edited by
                                  #39

                                  OOP also has object ownership hierarchy structures. Which object owns which other object, is a question always worth answering.

                                  E 1 Reply Last reply
                                  0
                                  • K [email protected]
                                    This post did not contain any content.
                                    pewpew@feddit.itP This user is from outside of this forum
                                    pewpew@feddit.itP This user is from outside of this forum
                                    [email protected]
                                    wrote on last edited by
                                    #40

                                    C is the way.3̶̧̧̳̉ẻ̵͙̗͍͒h̶͈̗̊͘o̷̡̳̥̒͐̇f̷͍̳͕̐{̸͇̀̒?̷̤͇̀̊p̴̰̆̍̕

                                    1 Reply Last reply
                                    1
                                    • B [email protected]

                                      OOP also has object ownership hierarchy structures. Which object owns which other object, is a question always worth answering.

                                      E This user is from outside of this forum
                                      E This user is from outside of this forum
                                      [email protected]
                                      wrote on last edited by
                                      #41

                                      Hmm, not sure, if I've heard of it. I'm guessing, we're not talking about simply drawing a UML class diagram...? Is it for figuring out which object will have to clean up which other objects, in non-GCed languages?

                                      B 1 Reply Last reply
                                      0
                                      • Q [email protected]

                                        ...definitely takes some getting used to when you come from a non-memory safe language...

                                        I actually think it's more like the opposite. The compiler takes the normal rules you apply to avoid issues with a non-memory safe language like C/C++ and enforces them explicitly where memory safe languages don't have those rules at all. I think lifetimes are much more confusing if you've never dealt with a user after free and usually let GC deal with it.

                                        Also yes the compiler warnings and errors are amazing, the difference between rustc and gcc is night and day.

                                        L This user is from outside of this forum
                                        L This user is from outside of this forum
                                        [email protected]
                                        wrote on last edited by [email protected]
                                        #42

                                        I can confirm, I've never used a non memory managed language, and the Rust borrow checker is a massive kick in the teeth

                                        But, the more i consider it from the perspective of memory, and pointers, the borrow checker makes a lot of sense

                                        Especially when storing references inside structs, and how mutability affects references

                                        I actually figured out i could fix a re-mutable borrow error by performing the two mutable operations in separate for loops

                                        1 Reply Last reply
                                        0
                                        • tatterdemalion@programming.devT [email protected]

                                          Arc is not free, and the extra atomic operations + heap allocations can become a bottleneck.

                                          P This user is from outside of this forum
                                          P This user is from outside of this forum
                                          [email protected]
                                          wrote on last edited by
                                          #43

                                          Oh, I did not know that. Well, it makes sense that it has a heap allocation, as it becomes more or less global. Though not sure why the atomic operations are needed when the value inside is immutable.

                                          M 1 Reply Last reply
                                          0
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          • Login

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • World
                                          • Users
                                          • Groups