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.
  • P [email protected]

    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 This user is from outside of this forum
    M This user is from outside of this forum
    [email protected]
    wrote on last edited by
    #44

    How can you otherwise keep track of an object's lifetime if copies are made concurrently?

    1 Reply Last reply
    0
    • E [email protected]

      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 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]
      #45

      Yes, pretty much like UML diagrams. Who is responsible for allocating memory and freeing it.

      Languages like Swift, Objective-C, C++ have features that mean you don’t need to do this by hand. But you have to tell the compiler if you want to keep and object around and who owns it.

      See this article on Objective-C to see the different ways to manage memory this language supports.

      E 1 Reply Last reply
      1
      • 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.

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

        The last language I learned was Rust, I did a mix of the two. I read through the canonical Rust book and then got to coding because I learn more deeply when I can apply what I've learned. It's still a tricky language to keep a conceptual model of in your head though.

        1 Reply Last reply
        1
        • B [email protected]

          Yes, pretty much like UML diagrams. Who is responsible for allocating memory and freeing it.

          Languages like Swift, Objective-C, C++ have features that mean you don’t need to do this by hand. But you have to tell the compiler if you want to keep and object around and who owns it.

          See this article on Objective-C to see the different ways to manage memory this language supports.

          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
          #47

          Ah, interesting. I went from garbage-collected languages where thinking about ownership might be useful for keeping complexity low and occasionally comes up when you manage lists of objects, but ultimately isn't needed, to Rust where well-defined ownership is enforced by the language.

          So, I wasn't aware that ownership is even as concrete of a thing in other languages...

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

            Ah, interesting. I went from garbage-collected languages where thinking about ownership might be useful for keeping complexity low and occasionally comes up when you manage lists of objects, but ultimately isn't needed, to Rust where well-defined ownership is enforced by the language.

            So, I wasn't aware that ownership is even as concrete of a thing in other languages...

            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
            #48

            Oh you need this in garbage collected languages too, once you run into memory use issues. GC languages are notorious for being wasteful with memory, even when working correctly.

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

              Oh you need this in garbage collected languages too, once you run into memory use issues. GC languages are notorious for being wasteful with memory, even when working correctly.

              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
              #49

              Not if you never get your application into production...

              Insert tips head GIF here.

              I wish this was as much of a joke as I'm pretending. It's so common for software projects to get cancelled that lots of tooling differences are just in terms of how long they let you not deal with long-term problems and how violently they do then explode into your face.

              For most of the development lifecycle of a GCed project, you're gonna ignore memory usage. And if you're lucky, it can be 'solved' by just plonking down a thiccer piece of hardware...

              B 1 Reply Last reply
              1
              • E [email protected]

                Not if you never get your application into production...

                Insert tips head GIF here.

                I wish this was as much of a joke as I'm pretending. It's so common for software projects to get cancelled that lots of tooling differences are just in terms of how long they let you not deal with long-term problems and how violently they do then explode into your face.

                For most of the development lifecycle of a GCed project, you're gonna ignore memory usage. And if you're lucky, it can be 'solved' by just plonking down a thiccer piece of hardware...

                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
                #50

                Great points. Especially putting in more memory can get you very far.

                Database optimization? Nah, just put in 1 TB of RAM to keep the whole DB in memory at all times.

                1 Reply Last reply
                1
                • 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.

                  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
                  #51

                  I will say this: for me, learning rust was 80% un-learning habits from other languages.

                  People tend to not like it when they have to change habits, especially if those took a long (and painful) time to acquire.

                  In this particular case, this is the same complaint Go faced with its form of explicit error handling. And Java, for that matter.

                  Honestly, Rust does a killer job of avoiding checked exceptions and verbose error hooks by way of the ? operator, and requiring all possible match branches to be accounted for. If you embrace errors fully, by using Result<> and custom Error types, your program gets a massive boost in robustness for not a lot of fuss. I recently learned that it gets even better if you embrace enum as a way to define error values, and make sure it implements useful traits like From and Display. With that, error handling code gets a lot more succinct, permitting one to more easily sift through different error values after a call (should you need to). All of that capability far exceeds any perception of clunkyness, IMO.

                  1 Reply Last reply
                  1
                  • 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 [email protected]
                    #52

                    This was my experience too, until I learned a few things.

                    • If you're coming from another programming language, the equivalent capabilities you're probably used to are Box, dyn, and Rc.
                    • Dynamic dispatch (dyn) isn't really necessary a lot of the time. Identify where you absolutely need it and solve everything else through other means.
                    • You wind up with lifetime specifier problems if you try to do a lot with references (&). Instead, try to re-think your structs and functions using composition and clone/copy instead. It's less efficient, but it's easier to optimize a running program, too.
                    • Rust enum, match, if let, and ? are weird, but are where you get the most leverage in the language. Try to master them.
                    • derive[...] is a first-class feature with a lot of standard lib support. Always use this to make your custom types mesh with the standard lib more seamlessly.
                    • If you are experienced with the "Design Patterns" book, you absolutely need this: https://rust-unofficial.github.io/patterns/intro.html
                    • Macros are an advanced feature, but help get you around limitations in generics and the type system in general. it really is worth knowing, and like the preprocessor in C/C++, isn't avoidable at the intermediate level.
                    • The compiler digs deep into your code to figure out types where they're not explicitly declared. I've seen it reach into the return type, call-spec, and function calls within that function, to figure out types for things. This is very hard to observe without an IDE that's checking syntax on the fly. Lean into both of those for more readable and maintainable code.
                    • if and match are expressions, not statements! You can use either block to evaluate to a single value, useful in composite expressions like let. Example; let x=if y>20 { y } else { 0 }; Or use them to return values from functions (w/o need of a return statement).
                    1 Reply Last reply
                    0
                    • 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.

                      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
                      #53

                      It pushes your code to be very tree-shaped

                      This is basically where my learning took me. I had to develop this notion that there was a preferred directionality to ownership and data flow, like "grain" in a piece of wood. Everything is easier if you go with the grain. "Tree-shaped" works too, since it basically is the call graph of a (single threaded) program.

                      The point where I realized all this was when I tried to do a very Python/JS-brained thing: return a closure from a function. The moment you try to "curry" values into the closure, you have to "move" them to solve for ownership, lest you bring timelines into the picture. Which isn't always what you want in a generic and reusable function. And sure enough, the standard lib and other popular libraries want you to pass a closure to functions instead.

                      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