Rust Data Modelling Without Classes

Поделиться
HTML-код
  • Опубликовано: 20 сен 2024
  • Today we're talking about how to design your projects in Rust without using inheritance.
    Thanks very much to today's sponsor Quadratic.
    Head to quadratichq.com/ to try it out!
    ❤️ If you would like to support what I do, I have set up a patreon here: / noboilerplate - Thank you!
    📄 All my videos are built in compile-checked markdown, transcript sourcecode available here github.com/0at... this is also where you'll find links to everything mentioned.
    🖊️ Corrections are in the pinned ERRATA comment.
    🦀 Start your Rust journey here: doc.rust-lang....
    🙏🏻 CREDITS & PROMO
    My name is Tris Oaten and I produce fast, technical videos.
    Follow me here / 0atman
    Website for the show: noboilerplate.org
    Come chat to me on my discord server: / discord
    If you like sci-fi, I also produce a hopepunk podcast narrated by a little AI, videos written in Rust! www.losttermin...
    If urban fantasy is more your thing, I also produce a podcast of wonderful modern folktales www.modemprome...
    👏🏻 Special thanks to my patreon sponsors:
    - JC Andrever-Wright
    - Miah Beach
    And to all my patrons!

Комментарии • 676

  • @NoBoilerplate
    @NoBoilerplate  Год назад +279

    ERRATA
    - 4:12 Replace -> Replaced

    • @sebred
      @sebred Год назад +15

      Aaah
      Panic!

    • @Slushee
      @Slushee Год назад

      What font do you use? I'd like to try out ligatures

    • @CyborusYT
      @CyborusYT Год назад +3

      Not an error per se, but integer types have their min and max values as associated `const`s, so you can write `u8::MAX` instead of `std::u8::MAX`

    • @theninjascientist689
      @theninjascientist689 Год назад +8

      4:13 shouldn't that be "REPLACED" instead of "REPLACE"? not nagging, I love your videos and found an excuse to leave work early when I saw the notification for this one!

    • @greglyons50
      @greglyons50 Год назад +3

      Damage is a transition that changes Mario’s state from Fire to Super, from Super to Mario, from… hold on, I need to compile this to make sure I got them all. :-)

  • @hotfishdev
    @hotfishdev Год назад +357

    I’m going through “Writing an Interpreter in Go” (Thorsten, 2018) but instead of Go I’m writing the program in Rust, translating the code as it’s presented. The Rust version using enums is *so much cleaner* then the class based system presented, and I get to skip whole sections when I realize that he’s implementing something that I already have for free. I’d highly recommend the exercise.

    • @sushaanthsureshkumar
      @sushaanthsureshkumar Год назад +3

      I am following the same think as well. Do you have a repo online?

    • @austinnar4494
      @austinnar4494 9 месяцев назад +1

      Ohhh I have this book, I might go through it again with this approach

    • @metaltyphoon
      @metaltyphoon 8 месяцев назад +2

      The hard part w using Rust on that book would be memory management. Unless u don’t care abbot it and just Box everything until ur program quits

    • @josephensminger1719
      @josephensminger1719 8 месяцев назад

      Link to repo 🙏🙏

    • @alang.2054
      @alang.2054 8 месяцев назад

      Oh yes, I have done something similar with the "Crafting interpreters", which code was written in Java. functional style with variants to represent AST nodes and pattern matching made it so fun

  • @Gaivs
    @Gaivs Год назад +298

    This is my favourite part of rust! As someone who works within robotics, representing state and transitions is vital, both for safety and for ensuring confidence that the system will be in well defined states for the lifetime of the program.
    With so many other languages, a small change in the represented state would correspond to an unknown amount of work to correct the system behaviour elsewhere, as you just don't know that it's wrong until you reach that part of the code.

    • @NoBoilerplate
      @NoBoilerplate  Год назад +51

      Yes! I can't even LOOK at python anymore without thinking I'm going to break it by doing a tiny fix

    • @VIue_
      @VIue_ Год назад +2

      I love rust for this! Do you know of a way to program FRC with it?

    • @ImaskarDono
      @ImaskarDono Год назад

      So, do you use Rust in robotics?

    • @vas_._sfer6157
      @vas_._sfer6157 Год назад

      ​​@@ImaskarDono Its not difficult for UR. Just rewrite or adoptate xmlrpc wrapper to rust.
      I dont use it now, but it can be great.

    • @Holobrine
      @Holobrine Год назад +2

      @@VIue_ I have an itch to port WPILib to Rust but I find it nontrivial to essentially rearchitect the whole thing to not use inheritance and such

  • @DavidL344
    @DavidL344 Год назад +459

    As a university student looking for an excuse to learn Rust, I want to thank you so much for making concepts in your videos easier to understand!

    • @NoBoilerplate
      @NoBoilerplate  Год назад +33

      My pleasure!

    • @Thomas-gi9vy
      @Thomas-gi9vy Год назад +4

      Oh my gosh that's exactly what I'm doing

    • @dd0n396
      @dd0n396 Год назад +1

      @@Thomas-gi9vy me too lol

    • @Randych
      @Randych Год назад +5

      here's your excuse: to become a better programmer (not just coding and crossing fingers) while also coding in language that put zealous concepts to extreme and was built around them

    • @gabfid3
      @gabfid3 7 месяцев назад +1

      OOP inheritance doesn't model reproduction unless something is cloned.

  • @JFelipeBa
    @JFelipeBa Год назад +251

    Your long search for a good state machine example was certainly worth it! Not sure how you just casually looked at the super mario world manual though haha, but I'm glad you did! Thank you as always for your great content!

    • @NoBoilerplate
      @NoBoilerplate  Год назад +48

      Ha! yes well, though I have MANY retro computers and consoles, I admit that manual was PDF, discovered by the youtuber linked on the slide - though he didn't go into it! I thought I would :-D

  • @patrick1532
    @patrick1532 Год назад +129

    When I was first starting to learn Rust coming from Python I was struggling to see the benefit of enums, but then I realized you HAVE to use enums to represent certain data structures. At first that felt restrictive, but then I realized that restriction relieved so much mental burden I'd have otherwise spent in Python thinking about the structure of the program just so that I, the one writing the program, would be able to understand it.
    In Rust more than any other language I feel like I can just DO things, rush them even, and the compiler is like R2-D2 was to Luke Skywalker, guiding me and filling the gaps I'm unable to fully grasp in my limited human working memory. When my code does start to get unwieldy, refactoring isn't some mess where everything becomes more confusing, often as a program grows it seems little slots arise where you know a certain type (like an enum) clicks in like a puzzle piece.
    My two cents of advice to people who want to learn Rust coming from more OO languages:
    1. ```struct != class```: Be careful with Impl block methods and the "self" keyword. Structs are purely data and methods are syntactic sugar for functions, as they always are, but this relationship is much closer to the surface in Rust than it is in other OO languages and you'll hit some frustrating roadblocks if you accept "struct == class" at face value.
    2. Avoid Traits except where the compiler tells you you need them or an API requires them. (i.e. #[derive(Clone, Copy, Debug)] ). As you learn you will find places where they fill a niche, but shoehorning them in as a replacement for c++ templates/js interfaces/python protocols is a recipe for unreadable spaghetti code.
    3. USE ENUMS. ALWAYS, ALWAYS, ALWAYS. They are fucking awesome, as this video handily outlines.

    • @NoBoilerplate
      @NoBoilerplate  Год назад +20

      Great advice, thank you!

    • @charliewhousen7133
      @charliewhousen7133 Год назад +13

      In my experience enums are not the medicine for every problem, i used to overcomplicate some programs since i was so amazed by enums too, that i felt i need to use it everywhere. But later i realised what a mess i have created

    • @Thekingslayer-ig5se
      @Thekingslayer-ig5se 8 месяцев назад +2

      Hey since you describe yourself as a guy who transitioned from python to rust ? How was it ? Was it that difficult ? I am a pro in python. Will I be able to learn rust faster ?

    • @RobertKats
      @RobertKats 5 месяцев назад +2

      Can you explain a little bit more about what you mean not to see structs as classes? What roadblocks have you seen?

  • @pixelstriko1642
    @pixelstriko1642 Год назад +18

    I love enums, they're a really nice way to represent "choices" in the type system, rather than writing ugly if statements that try to verify everything with a bunch of bools

    • @NoBoilerplate
      @NoBoilerplate  Год назад +6

      Right! And the compiler knows what you mean too!

  • @Killzre
    @Killzre Год назад +92

    Having learned Haskell just before Rust, enums felt just right. And since now having spent a lot more time in Rust, I always feel good when I use a nice match expression! Thanks Tris!

    • @NoBoilerplate
      @NoBoilerplate  Год назад +13

      Nice! love a nice strong type model, aws sdk is like that for rust too, lovely!

    • @jesperpersson9388
      @jesperpersson9388 Год назад +2

      This was my path too. This is the way.

  • @Robstafarian
    @Robstafarian Год назад +15

    I pretty consistently worry that I am watching your videos too soon, having barely started with Rust, and the elegance of your explanations prevents brain fog.

    • @NoBoilerplate
      @NoBoilerplate  Год назад +4

      This is my video for you ruclips.net/video/2hXNd6x9sZs/видео.html

    • @delanym
      @delanym 11 месяцев назад

      its not you, its too dense and too fast. My 2 cents

  • @PromptStreamer
    @PromptStreamer Год назад +17

    One of my favorite RUclips channels even though I don’t really watch the videos. It’s just something about the overall style and personality that bleeds through them. There’s no filler and there’s no commercialism. It just feels like a sincerely enthusiastic person trying to tell you something clearly that actually is of interest. It definitely hugely has led me to be sure to check out more Rust whenever the opportunity is there. I still hear his swinging British voice in my head when I try it, like, “In Rust, all you have to do is read the compiler message carefully.”

    • @NoBoilerplate
      @NoBoilerplate  Год назад +3

      Thank you so much! Did you know I also make an audiofiction podcast about AI, tech, and mental health? I'd love to know what you think! ruclips.net/video/p3bDE9kszMc/видео.html
      Season 12 just dropped this week!

    • @delanym
      @delanym 11 месяцев назад

      no commercialism?

  • @onerimeuse
    @onerimeuse Год назад +18

    That Mario example is what I've needed for months! That's so good. And tying it to the actual code, chefs kiss. I finally get state machines, and I have a tangible idea of how it can be made. Thank you!

  •  Год назад +13

    One of my favourite applications for state machines is fighting game input parsing. In a game like Street Fighter, a particular special move might require a sequence such as down, down-right, right, punch. But the games build in a bit of leniency, so your timing doesn't have to be exact. A great way to read the player's inputs then is to create a state machine for the special move, feeding the last several frames' worth of inputs through it. It makes it easy to define leniency as well as failure states in precise terms.

  • @AceofSpades5757
    @AceofSpades5757 Год назад +50

    I've instinctively tried to use this in other languages, only to find despair. Rust is just so fantastic.

    • @pixelstriko1642
      @pixelstriko1642 Год назад +6

      Can agree, after getting comfortable with rust's enums I tried going back to typescript, but they had limited enum support and it just didn't feel the same as Rust.

    • @NoBoilerplate
      @NoBoilerplate  Год назад +19

      There is no going back, welcome to the cargo cult!

    • @invinciblemode
      @invinciblemode Год назад +3

      Yes, I write typescript at work and rust at home. It’s makes my job so miserable when try to use a worthless typescript enum….

    • @efkastner
      @efkastner Год назад

      I wish they’d just remove them!

    • @mp1404_
      @mp1404_ Год назад +4

      FYI, you can use sum types in typescript as well. It's not as clean as in rust, but you can represent the cat example pretty well there. They are just not called enums.
      What typescript doesn't have tho is an equivalent to the match expression that makes the enum feature so powerful in rust.

  • @geeshta
    @geeshta Год назад +10

    I don't know Rust but it's really fun pausing your videos on code snippets and compiler errors, trying to figure out what it means and being successful almost every time!

    • @NoBoilerplate
      @NoBoilerplate  Год назад +3

      Sounds like you're learning! :-)
      You might find github.com/rust-lang/rustlings really works for you

  • @ycombine1053
    @ycombine1053 Год назад +9

    Interesting to see a nice algebraic type system and exhaustive pattern matching outside of a functional language. This was always my favorite feature of F#.

    • @NoBoilerplate
      @NoBoilerplate  Год назад +4

      Rust is actually a hybrid functional/imperative language, it's not a pure functional language. I think this is part of it's genius, and I see this everywhere in the language: Sensible defaults, but with escape hatches for practicality. (like the unsafe system)

    • @xGOKOPx
      @xGOKOPx 10 месяцев назад +1

      Rust is pretty heavily inspired by function programming. Initial compiler was written in OCaml :)

  • @SushantShekhar-my7eu
    @SushantShekhar-my7eu Год назад +10

    Your videos spiked so much interest for Rust in me that I ditched the plan for learning Golang. Reading the Chapter 10 in TheBook now.

    • @NoBoilerplate
      @NoBoilerplate  Год назад +1

      YES! Check out my rust playlist starting with ruclips.net/video/2hXNd6x9sZs/видео.html

  • @jayedr8728
    @jayedr8728 Год назад +17

    As someone who is currently learning rust, i just finished the chapter on enums from “the book”, and i was able to understand and comprehend whats going on, hats off to you for explaining a what seems like complicated topic in such an elegant way !! This was both a useful rust video and an explanation of how machine state logic works! Amazing

    • @NoBoilerplate
      @NoBoilerplate  Год назад +5

      My pleasure! Enums aren't complicated, are they, but they are unfamilir!

    • @efkastner
      @efkastner Год назад

      I haven’t started playing with Rust yet but if the amount of stuff I’m consuming about it is an indication it’s going to happen any day now hah! I will say though that “Enum”s are a bit scary for me, I’ve been burned too many times. I’m not sure I can think of a single time I’ve used an enum in a language, metalanguage, db, framework, engine, what-have-you and *not* lived to regret it. I probably wouldn’t have even thought twice about it had they gone with another name :P

  • @detaaditya6237
    @detaaditya6237 Год назад +28

    I always wonder why a lot of popular languages don't have sum types natively built in. It's like.. one of the most fundamental way to model data

    • @NoBoilerplate
      @NoBoilerplate  Год назад +23

      It's WILD they choose *gestures at all of OO's bullshit* instead of just this one simple feature!

  • @kellybmackenzie
    @kellybmackenzie Год назад +3

    I love algebraic type systems so much!! Haskell made me fall in love with them. I love this!!

  • @DNA912
    @DNA912 Год назад +3

    As soon as I tried out enums and match in rust. I completely fell in love with the language once again. And it's intuitive, everytime I use emus and match statements, it FEELS very familiar, yet, not.

  • @maxpursian
    @maxpursian Год назад +5

    Great as always! I'm currently writing my Bachelor's Thesis and I have utilised Rust for a lot of the implementation, and its growing more and more on me, thanks for introducing me to this wonderful language :)

    • @NoBoilerplate
      @NoBoilerplate  Год назад +2

      Wonderful! My pleasure, good luck with it all!

  • @avramlevitter6150
    @avramlevitter6150 Год назад +3

    C++ has been learning a lot from Rust, and this kind of enum has been implemented in the Standard Template Library as std::variant. The match described here would be analogous to std::visit executes a function on the current state of the variant, and requires that the function being executed has a valid overload for any of the types declared.

    • @NoBoilerplate
      @NoBoilerplate  Год назад +3

      C++ learns from *every* language, and that's kinda the problem, right? :-D
      Someone commented on one of my videos something I think of often "If you almost never add features, you get C, if you almost never remove them, you get C++"

  • @kyle-silver
    @kyle-silver Год назад +11

    Great video! My one piece of advice is: this works in Rust because of its language-level features. If you’re working in an OO language (like I am for my day job) you may end up with something that is both non-idiomatic and also doesn’t provide the same guarantees as the Rust equivalent. I have been guilty of this and it does not turn out like you’ll want it to 😅
    All the more reason to oxidize your codebase, though!

    • @NoBoilerplate
      @NoBoilerplate  Год назад +4

      Ah, yes of course! If you're stuck with OOP, then you figure out how to best get the job done - thank you for your service!

    • @kyle-silver
      @kyle-silver Год назад +2

      @@NoBoilerplate thanks! 🫡 I’ll say that the most recent Java iterations have introduced “sealed interfaces” and “record classes” which, combined with some improvements to pattern matching in switch statements, actually make some of the techniques you outlined more feasible (although still inferior because it’s much more verbose and the guarantees aren’t quite as strong). It’s quite illuminating of just how badly people want these features, though

  • @dinophage
    @dinophage Год назад +9

    I really enjoy the idea of modeling states and find it far more intuitive as a developer than OOP (especially the make many classes just to inherit down to the one I actually use). I am sure we can get around this by simplifying but my mind immediately tries to explore the edge cases where it's difficult to model the states directly with a finite state machine - such as programs that might simulate complex biological systems. It certainly doesn't abrogate the utility of representation by states but it does bring into view some interesting ideas of more fluid states of giant matrices of floating point numbers.

    • @NoBoilerplate
      @NoBoilerplate  Год назад +3

      Yeah, we're collectively waking up from the OOP dream as an industry I think.

  • @markzuckerbread1865
    @markzuckerbread1865 Год назад +9

    On the topic of making invalid states unrepresentable and normalized representations of data, I recommend the excellent essay by Alexis King by the title "Parse, don't validate", it's in haskell but I believe its still relevant enough.
    Great vid btw :)

    • @NoBoilerplate
      @NoBoilerplate  Год назад +3

      Ooh thank you, will read! Love haskell, for me Rust is haskell snuck into the cool kids party in C's clothing (wearing Lisp's shoes)!

  • @FourthDerivative
    @FourthDerivative 7 месяцев назад +1

    Illustrating FSMs using Super Mario powerups was an unexpected twist. Great stuff!

  • @rotteegher39
    @rotteegher39 Год назад +26

    // personally I aim to live up to std::u8::MAX
    8:27
    Great motivation!!!

    • @NoBoilerplate
      @NoBoilerplate  Год назад +5

      I've started my training by eating more XD

    • @rotteegher39
      @rotteegher39 Год назад +1

      @@NoBoilerplate My training is to do 50 squats every time I go to the toilet during production xD

    • @almightysapling
      @almightysapling 7 месяцев назад

      @@NoBoilerplate psh, I'll just use a gameshark

  • @funkdefied1
    @funkdefied1 Год назад +4

    I’m building my first desktop app for my FIL’s work. For simplicity, I’m writing it in Python using a custom TUI package. The core interactivity of the app involves mapping key presses to actions, which depend on which screen is loaded.
    I was planning to recreate the app in Rust once I finished (Taurus framework). Now I know how I’ll approach it. Thank you!

    • @NoBoilerplate
      @NoBoilerplate  Год назад +1

      Fantastic! If you wanted to build a Rust TUI, there's a fantastic framework called crates.io/crates/cursive
      But Tauri will be great too!

  • @computerfan1079
    @computerfan1079 Год назад +7

    Amazing video as always. I have kind of thought of this: I have recently had an OOP design patterns course and a functional programming course and I thought:"there must be an easier way of implementing these patterns functionally". Turns out you can indeed

    • @NoBoilerplate
      @NoBoilerplate  Год назад +4

      First class functions + sum types = all patterns!

  • @GeekLaunch
    @GeekLaunch Год назад +10

    I applaud you, sir. Superior presentation, as I've come to expect. :)

  • @job4753
    @job4753 Год назад +4

    Great video as always!
    Recently had to do a project that would need to be super reliable as it would fetch data constantly, and match arms to make error handling have just been great. Together with loop flags the code just looks clean is super readable

  • @nanman_chief
    @nanman_chief Год назад +4

    In the 1980s and 1990s, there were many programming language designers working on OOP (also functional programming), such as Luca Cardelli, who was involved in the design and development of Modula-3 and ML, Philip Wadler also worked on Java and Haskell. We can see that the history of OOP and FP is closely related. However, due to the excellent marketing techniques of Sun and Oracle, some people later believe that Java has the sole right to explain OOP :P

  • @timephy
    @timephy Год назад +2

    Hey, i really enjoy this kind of „advanced technical rust“ would love to see more of these concepts!
    Thank you for your great videos!

  • @davidstelter2391
    @davidstelter2391 2 месяца назад

    That was great, gave me some inspiration for a state modeling section of an embedded program I'm working on. And I really appreciate the no-fluff, information-dense, focused approach on this video!

  • @Izapertron123
    @Izapertron123 Год назад +3

    This video is just amazing.
    Coming from python to rust would be impossible for me without this channel!

  • @ahmed.systems
    @ahmed.systems Год назад +2

    This is very informative. I've always struggled with data modelling, in rust, in particular. Will be saving this for many rewatchs. As always, thanks for the quality content.

  • @arsnakehert
    @arsnakehert Год назад +2

    Gotta say, this is one of the first few times I've seen a truly interesting and relevant sponsor product

    • @NoBoilerplate
      @NoBoilerplate  Год назад +2

      My hope is that I'll only need to get this kind of sponsor - my experience with the Big Sponsors (squarespace etc) has been very ick

  • @pwells19
    @pwells19 Год назад +2

    Amazing video! I’m just getting into rust, coming from an OO background and this really clarified some things for me. Thanks for your work!

    • @NoBoilerplate
      @NoBoilerplate  Год назад

      My pleasure! I hope everyone gives Rust a go, have you seen my whole Rust series? I'd start with ruclips.net/video/2hXNd6x9sZs/видео.html&lc=Ugy1Nxse098tA5xqmTB4AaABAg

  • @joseph0x45
    @joseph0x45 Год назад +4

    I was just watching your video on How to learn Rust and this drops, NOICE

  • @_Aarius_
    @_Aarius_ Год назад +2

    I love enums. They're the rust feature I find the most useful for actually representing the problems I need. In most other languages they are less strict, less useful or dont exist at all.

  • @Richard-sp3ul
    @Richard-sp3ul Год назад +2

    Really cracking video. I'm just starting out with Rust, approaching as a full reboot of my understanding of programming. I found the video very helpful. Great example with Mario..

  • @aybgim3850
    @aybgim3850 Год назад +13

    As a fan of Rust I have to acknowledge that Typescript's algebraic types are even more expressive. You can create union or intersection types by enumerating existing types or existing values. E.g. type result = number | boolean | "error" | (mytype & myothertype). And it also does OOP the right way, by supporting structural, as opposed to nominal subtyping (just like Rust).

    • @TinBryn
      @TinBryn Год назад +5

      One issue with these union types to represent errors is that sometimes you want the success and failure types to actually be the same type, but distinct from each other. A simple example is binary_search which returns Result. Ok(usize) means that it found it, this is the index, and Err(usize) means it didn't find it, but this is the index where it needs to be inserted.

    • @aybgim3850
      @aybgim3850 Год назад +3

      @@TinBryn Sure, they CAN be of the same type but they don't HAVE to be. Having said this, TS doesn't support pattern matching so union type flexibility remains as a hugely underused superpower. Hope Microsoft will learn the lessons of Rust.

    • @nanman_chief
      @nanman_chief Год назад +1

      This is such a powerful type system that no one really knows how to do a good job of static type inference/check for intersection/union types (including basic structural subtyping), even though subtyping have a long history. The first whole-program type inference algorithm for subtyping didn't appear until 2017, and further extensions with intersection/union types won't be released until 2022, there's still a lot of work to be done (look for MLstruct or MLscript if interested, which is the state of the art). So the current languages that use these features either dynamic type checking or introduce gradual typing like Typescript.

  • @0xDEAD_Inside
    @0xDEAD_Inside Год назад +4

    This is one of the most underrated features of rust. Programming states is hard and rust makes it so easy.

  • @alexanderbecker4360
    @alexanderbecker4360 Год назад +2

    Hi, You have given me so many cool insights and delimited them so nicely from concepts that I knew from other languages allowing me to see what the purpose they have and what the reasoning behind them are. You have in that way contributed to how I go about my work and in turn. Thanks so much.

    • @NoBoilerplate
      @NoBoilerplate  Год назад +1

      My pleasure Alexander! Do check out my other Rust videos for tips, and links to other great educators!

  • @martinbecker1069
    @martinbecker1069 Год назад +2

    You can do something similar with phantom data types, like having a type called `Container` that can be locked or unlocked. This is useful because you can enforce state at the API level, for example you, if do `impl Container { fn open {...} }`, the open function will only be usable when the container is in the unlocked state.

    • @NoBoilerplate
      @NoBoilerplate  Год назад +2

      ooh that's COOL! Yes certainly I've seen much more clever patterns, I just showed the simplest one in this video.

    • @martinbecker1069
      @martinbecker1069 Год назад +1

      @@NoBoilerplate I apologise, wasn't trying to imply that the method you were showing wasn't clever or anything, I just wanted to share something I thought was cool.

  • @josiasaurel7376
    @josiasaurel7376 Год назад +2

    Amazing. Every time I watch your videos it feels like one step toward being a better developer.

    • @NoBoilerplate
      @NoBoilerplate  Год назад

      I feel then same as I do the research to write them :-)

  • @iamworstgamer
    @iamworstgamer Год назад +1

    you are a real teacher. I must say i watched a lot of rust videos but only you were able to explain what actually rust enum is.

    • @NoBoilerplate
      @NoBoilerplate  Год назад +1

      I'm so delighted, thank you for saying so :-)

  • @r2_rho
    @r2_rho Год назад +1

    The specificity in this video was excellent, I feel like I both got an idea of the theory and a concrete relatable implementation that can scale to any size. I loved this format to present the content. Well done!

  • @miloszivkovic6256
    @miloszivkovic6256 Год назад +2

    You can make error state unrepresentable in every good language (I often do it in Java), the reason we have so many IFs is because we are writing client facing applications that have to handle bad input, you can't make 400 Bad Request unrepresentable.

    • @NoBoilerplate
      @NoBoilerplate  Год назад +2

      my favourite web frameworks in Rust, Poem-openapi, accepts client input in terms of data types, validated automatically by the compiler, not manually with ifs. It's wonderful!
      (docs.rs/poem-openapi/2.0.26/poem_openapi/)
      Your data model (using enums and structs, just like in this video) becomes the compiler-checked contract between your client and server.

  • @laachax9279
    @laachax9279 11 месяцев назад +2

    Thank you so much for these videos! My first language was java and I think it really messed with me for years so I never felt like I could actually make anything. OO is all I knew, so it's all that made sense. But the last week or so learning rust, programming finally feels... natural to me instead of a frustrating byzantine experience. Though I did play with C, all the memory and boilerplate I had to make and use really scared me off, making me feel stupid.. Rust makes me feel like a genius, like you said!

    • @NoBoilerplate
      @NoBoilerplate  11 месяцев назад +1

      Fantastic! I'm so pleased for you! Yes, I feel just the same!

  • @RandomGeometryDashStuff
    @RandomGeometryDashStuff Год назад +3

    04:14 nice thing about objects is:
    `a.push(1)` is shorter than `push_to_array(a,1)`
    most other stuff is obfuscation

    • @NoBoilerplate
      @NoBoilerplate  Год назад +2

      like my example of itsame.collect() ? That's not object orientation, that's method call syntax, every language has that! :-D

    • @RandomGeometryDashStuff
      @RandomGeometryDashStuff Год назад +1

      ​@@NoBoilerplate> like my example of itsame.collect() ?
      yes
      > every language has that
      C doesn't have that

    • @mitrabeast
      @mitrabeast Год назад +1

      @@RandomGeometryDashStuff function pointers

    • @RandomGeometryDashStuff
      @RandomGeometryDashStuff Год назад

      @@mitrabeastyes but that takes up extra memory

    • @mitrabeast
      @mitrabeast Год назад +1

      @@RandomGeometryDashStuff just as vtable does

  • @PaKa-kj3rj
    @PaKa-kj3rj Год назад +1

    Greetings from New Zealand. Love your videos mate, just straight up the guts info to the ears. Thanks!

    • @NoBoilerplate
      @NoBoilerplate  Год назад

      Thank you! Did you know that the latest Lost Terminal 10-episode special is set on the North Island? Just wrapping it up, I'm so proud of it, it's called "41: South".
      It's a Patreon special, but the first two are public!-> ruclips.net/video/EElC_1LbyOI/видео.html
      I'd love to know your thoughts.
      (The main public podcast that I write produce and perform is here if you're interested, also it provides context to the special: ruclips.net/video/p3bDE9kszMc/видео.html)

  • @mendown8045
    @mendown8045 Год назад +2

    Very interesting way of designing a program(and thinking about the problem). Looking forward to applying the state machine!

  • @wannabelikegzus
    @wannabelikegzus Год назад +1

    This is amazing. The amount of time I've had to spend working on edge case unit testing is exhausting.

    • @NoBoilerplate
      @NoBoilerplate  Год назад

      Right! 90 percent of unit tests kines are unnecessary in rust - you can focus on integration and your program

  • @miguelguthridge
    @miguelguthridge Год назад +4

    Rust's Enums make me dread working in any other language - they're just so powerful and I wish that the equivalents in Python and TypeScript were as powerful. It's technically possible to do it in both, but Rust just makes it so nice to work with.

    • @NoBoilerplate
      @NoBoilerplate  Год назад +3

      Haskell's got them :-D

    • @efkastner
      @efkastner Год назад +1

      Does Elm? I played with it a little bit and really enjoyed the (what they call) pattern matching

    • @selayarlaut2746
      @selayarlaut2746 Год назад +1

      ​@@efkastner yes elm also supports Algebraic Data Type

  • @flwi
    @flwi 6 месяцев назад

    Nice, looking forward to learning rust - my goal for the next weeks. I'm an experienced scala developer and was happy to see lots of familiar concepts. Let's see how far I get.
    Thanks for your great, concise and motivational videos!

  • @maleldil1
    @maleldil1 Год назад +4

    The only thing I'd change in the example is to make collect return a Player instead of mutating the self.state field. Of course, this depends on how the wider system behaves, but one should always default to immutability unless you have a strong reason not to.

    • @NoBoilerplate
      @NoBoilerplate  Год назад +3

      Yeah, in an early draft I used the chain pattern to do exactly that, however I decided to go for this more familiar way, so as not to hit folks with too many new patterns all at once :-)

    • @KohuGaly
      @KohuGaly Год назад +1

      That is not a good idea. To see why, consider what happens if you store Player as a field in a struct. You can't just take it out, shove it into a function and then pluck the hole with the return value. You would have to take the overarching struct apart and put it back together to do that. Taking shared reference is preferred here, as it lets you modify Player in place.

    • @yondaime500
      @yondaime500 Год назад +1

      The Rust API guidelines discuss that in the Type Safety section, Non-consuming builders and Consuming builders. They say taking &mut self (i.e., non-consuming) is preferable when you can, but if one of the methods needs to take ownership, then all methods should take ownership so you can still chain them. The standard library has examples of both cases, e.g., std::process::Command for non-consuming and std::thread::Builder for consuming.

  • @shimadabr
    @shimadabr Год назад +2

    That Mario example was so on point that i wonder why people don't use videogames when trying to implement automatas/state machines while learning. It's so obvious actually haha. I had to build a very abstract state machine on my automata class.

    • @NoBoilerplate
      @NoBoilerplate  Год назад

      To be fair, it took me a few days of hand-wringing to find it. I was so close to making up a cool example (maybe of airlocks on a space station) but the mario example is PERFECT

  • @bobbycrosby9765
    @bobbycrosby9765 Год назад +5

    It's not exactly the same, and it's not completely there yet, but Java is working on bringing this style of programming to Java with the features: sealed classes, switch expressions, and pattern matching in switch. They call it "data oriented programming" and it's one of the over-arching goals of Project Amber - minor improvements to the language where the sum is greater than the parts.

    • @NoBoilerplate
      @NoBoilerplate  Год назад +5

      If you almost never add features, you get C, if you never almost never remove features, you get C++.
      Somehow, Java's not learned this lesson XD

  • @TheGeorey
    @TheGeorey Год назад +2

    My wedding: 👕👖👟
    No Boilerplate uploads: 🤵‍♂️🍷

  • @AllanSitte
    @AllanSitte 9 месяцев назад +1

    I am a old school DBA and data modeling scientist.
    Your video has convinced me to look further into the Rust language.
    Old dogs can learn new tricks. 😆

    • @NoBoilerplate
      @NoBoilerplate  9 месяцев назад

      Wonderful! I have a short playlist of essential Rust viewing, if interested: ruclips.net/video/oY0XwMOSzq4/видео.html

  • @me5ng3
    @me5ng3 Год назад +1

    While true regular expressions can be represented using state machines, please remember that what we use in modern languages as regex isn't the actual original regex that automata theory talks about but an "upgraded" version of it which can not be represented as a state machine, only partially and with many hacks

    • @NoBoilerplate
      @NoBoilerplate  Год назад +2

      Aha, thank you very much for this update

  • @RenderingUser
    @RenderingUser Год назад +3

    Lmao
    I though RUclips bugged out when I saw a meme instead of the usual style of the thumbnail

    • @NoBoilerplate
      @NoBoilerplate  Год назад +1

      I'm not sure if it's right, but it is FUNNY!

  • @PaulSebastianM
    @PaulSebastianM 9 месяцев назад +1

    Sum types can be simulated in languages that don't have them using interfaces/abstract base classes, and distinct types for each variant. For example instead of a single Cat class/struct, you'd have two classes: AliveCat and DeadCat. That way you can have just the alive cat implement the IAliveCat inferface (which can get hungry) and the implementation is of course up to you. Of course both of them ca implement a base ICat (marker) interface. At the end of the day, the way to correctly model a domain in your programming language of choice is mostly a matter of skills.

    • @NoBoilerplate
      @NoBoilerplate  9 месяцев назад +1

      Sum types are more than that, check this out: ruclips.net/video/sbVxq7nNtgo/видео.html

    • @PaulSebastianM
      @PaulSebastianM 9 месяцев назад

      @@NoBoilerplate well, true. I know. I was just trying to refer to the example usage you demonstrated. Thanks for the link.

  • @andrewgr144
    @andrewgr144 Год назад +5

    OOP is very well suited to the original use-case that drove its adoption: modern UIs. Modeling Windows, dialog boxes, widgets as classes actually matches how we think about and interact with those objects very well. Inheritance is natural and obvious for most modern UI elements, the idea of a click "sending a message" to the object that was clicked on is super intuitive and straightforward, etc. C++ was an absolutely vital evolution of C, as Windows and MacOS became ubiquitous. If OOP is indeed the mistake that you suggest it is-- which I don't feel qualified to have an opinion about, since I last programmed professionally over a decade ago, and even then it was systems-level programming so I wasn't using OOP much-- then I feel sure it must be because programmers who used OOP principles as a hammer to great effect in the UI domain, looked at every other problem domain and saw a bunch of nails.

    • @NoBoilerplate
      @NoBoilerplate  Год назад +3

      encapsulation is a great method for building UIs, like HTML, but don't confuse that with inheritance. Actor message passing is a great way to build distributed systems, but don't confuse that with object orientation.
      Very well meaning smart people indeed made object oriented methods frameworks work very well. But I propose that they are working well not BECAUSE of OOP, but DESPITE of it.

    • @andrewgr144
      @andrewgr144 Год назад +2

      @@NoBoilerplate I'm in the awkward position of believing very strongly that you're wrong about this particular use-case, based on 10+ years as Software Development Engineer and Software Development Lead at Microsoft, spending most of that time working in the Windows division; but at the same time, being keenly aware that you have much more information about both 'sides' of this issue than I do, and are therefore more qualified to pass judgment. I guess the most I can assert is that I understand the core principles of OOP, I know how true inheritance is used to great effect in the Windows framework (I don't even know what it's called anymore, as I said it's been over a decade since I programmed professionally, and even longer than that since I did anything in User mode), and that to me, it felt like the framework mapped easily and intuitively to how I thought about what was going on, on screen. And I guess I can also say that after watching a dozen or so videos on Rust over last few days, I'm going to dust off my Linux machine that I don't think I've even booted in a couple of years, install Rust, and work my way through some cryptography problem sets that I've been wanting to get to for a while, but wasn't excited enough to want to do without the additional incentive of learning an interesting new language (and potentially IDE, though I suspect I'll just stick with VS Code, more due to my lack of energy than anything else). Perhaps I'll see things from your perspective if I stick with Rust long enough to appreciate the design approach it encourages-- if so, I'll leave you a comment. Thank you for your channel, and thank you for taking the time to make thoughtful responses to your viewers.

  • @huuhhhhhhh
    @huuhhhhhhh Год назад +1

    I know this isn't the topic of the video but it was only a week or two ago that I was saying that I didn't understand why nonone had made a spreadsheet app that supported python in the cells.
    Seems so obviously brilliant

  • @enclave2k1
    @enclave2k1 Год назад +4

    _"You can forget gang of four patterns..."_
    But, they are forever etched into my smooth brain.

    • @NoBoilerplate
      @NoBoilerplate  Год назад +5

      If you have first class functions, you don't need most of the GoF patterns! www.defmacro.org/2006/06/19/fp.html

    • @enclave2k1
      @enclave2k1 Год назад +1

      @@NoBoilerplate After using them for much of my education and most of my career - it's hard letting go.
      Stockholm syndrome, I suppose.

  • @alexgeorgousis1948
    @alexgeorgousis1948 Год назад +2

    This is one of the videos I'm gonna save for future reference, or as a quick link for friends who ask me "what's so great about rust?" Really well explained! I have a minor question about the very first point in the video about sum versus product types. Can't sum types be represented in any OOP language using either interfaces (and implementing classes) or subclasses with different attributes? Obviously you don't get things like match statements, which are absolutely lovely, but is there anything else I'm missing about why this is something that OOP languages can't do? Thanks!

    • @KohuGaly
      @KohuGaly Год назад +3

      OOP languages can do sum types. If your OOP language supports downcasting and enumerators, than you can implement sum types quite easily. The issue is the boilerplate code you need to make it work. It's usually not ergonomic nor foolproof to implement sum types in language that lacks first-class support for them.

    • @NoBoilerplate
      @NoBoilerplate  Год назад +2

      Exactly, and because they're not first-class citizens, the compiler is not optimised to rationalise about them.
      It's like saying you can build strings in any language that supports integers! :-D

  • @pup4301
    @pup4301 Год назад

    I already solved this problem through having utility functions in traits. You have a function to get a smart pointer to some base stucture in a structure or the structure itself, a function to convert the smart pointer to a any, and a function to get embedded structures or the structure itself based on the logic of a passed function. You can create a list of different typed data and do everything here and more.

  • @frazuppi4897
    @frazuppi4897 Год назад +1

    quadratic is amazing, glad to see high level sponsors

    • @NoBoilerplate
      @NoBoilerplate  Год назад

      I really dig it! I hope to keep partnering with Rusty sponsors!

  • @PaulFWatts
    @PaulFWatts Год назад +1

    Thank you for your video’s ❤. They definitely have me excited and high,y motivated to learn Rust.

    • @NoBoilerplate
      @NoBoilerplate  Год назад

      Wonderful! This is just what I want to hear :-)

  • @KohuGaly
    @KohuGaly Год назад +1

    Most people outside Biology don't know this, but the strict inheritance-based hierarchy in the taxonomy of life was actually the main proof that life is not intelligently designed. Every living organism contains strange vestigial traits that are only useful in its relatives (often very distant ones, or even extinct ones); and contains clunky workarounds for lack of features that are elegantly and readily implemented in unrelated organisms. All for the sake of adhering to a strict inheritance hierarchy.
    No intelligent being being would design complex systems this way.... except a software developer, apparently...
    I'm certain you came across these exact problems when using classes in SW design. I know I did. It wasn't apparent why that is until I studied biology more deeply. Only then I realized that it's accidental complexity of class-based OOP, not inherent complexity of the problem domain. It's so obvious in retrospect... The sheer amount of propaganda and band-wagoning that must have occurred, for classes to become defacto dogma of software development, is mind-boggling.

    • @NoBoilerplate
      @NoBoilerplate  Год назад

      It's very easy to teach, is the problem.

    • @KohuGaly
      @KohuGaly Год назад

      @@NoBoilerplate is it though?!
      I find it surprisingly difficult to explain clearly what a class is and what inheritance is for. In fact, I haven't seen an intuitive explanation of it, ever. Definitely not one that would leave you with the ,oh so satisfying, _"I could have come up with this myself"_ level of understanding.
      By contrast, you can summarize Rust's model succinctly with clear justifications for every feature:
      - *structs?* It's data logically tied together
      - *impl blocks?* it's functionality uniquely associated with that data
      - *traits and generics?* you can write code that works for anything that has some common functionality
      - *pub and mod?* delineate which parts of code are public functionality and which parts are implementation details for internal (re)use.
      For classes and inheritance, the connections between features and their purpose is much more tangled.

  • @Dazza_Doo
    @Dazza_Doo Год назад +1

    The Mario example is Great. This is no harder then when I did Enums in C#, except this is much better.

  • @overlisted
    @overlisted Год назад +2

    State machines are also how futures work in Rust and how they're polyfilled in JS

  • @minar7555
    @minar7555 7 месяцев назад

    this video sold me rust. Thanks NoBoilerplate

  • @EvanBoldt
    @EvanBoldt Год назад +1

    Your videos are some of the most usefully educational on the internet.

  • @betterlifeexe4378
    @betterlifeexe4378 Год назад +1

    I know that this is a video about enum specifically, but it ended up being one of the best videos arguing for the use of rust.

    • @NoBoilerplate
      @NoBoilerplate  Год назад +1

      Any language that has enums is a good language. I'm really confused that go didn't add them from the start, big miss there!
      Rust's also go like 10 other wierd features that make me want to code in no other language, here's a playlist if you're interested ruclips.net/video/oY0XwMOSzq4/видео.html

  • @Zeioth
    @Zeioth 6 месяцев назад +1

    Watching rust videos on youtube: "Oh my god this is so different, I get it but I can't remember it."
    Actually contributing to a simple freedom software project: "Wait, that's all there is to it?"

  • @augusto256
    @augusto256 Год назад +5

    I hope the Rust Foundation doesn't take your channel down.

    • @NoBoilerplate
      @NoBoilerplate  Год назад +3

      tech.lgbt/@noboilerplate/110179211054956798

    • @augusto256
      @augusto256 Год назад

      @@NoBoilerplate Well, I respect your opinion.

  • @carlod1605
    @carlod1605 Год назад +2

    4:36 Wow, it improves all things I hate about ms excel. Basically excel was created for non-programmers and that's why it's extremely unintuitive for me to do nontrivial things.

    • @NoBoilerplate
      @NoBoilerplate  Год назад

      Don't knock excel, the world runs on spreadsheets and macros! :-O

  • @christianloose9875
    @christianloose9875 Год назад +4

    I think this video would have been better without trying to tell everybody how "wrong" they are using OOP. I developed software with OO since over 25 years and never experienced the issues that you mentioned. Like the diamond issue. OOP has evolved as well (e.g. Composition over Inheritance). So my suggestion would be to just show what you got and let the benefits and code speak for itself.

    • @NoBoilerplate
      @NoBoilerplate  Год назад

      As an industry we are moving away from OOP, new languages like Go, Rust and Zig don't bother with it for a reason.

    • @T0m1s
      @T0m1s Год назад +1

      @@NoBoilerplate - it depends on how you define OOP. Both Go and Rust have, at the very least, objects (structs with associated methods), and while you won't have long inheritance hierarchies you can certainly still continue writing code in an OOP style. Favouring composition over inheritance helps to a degree but doesn't solve the problems of OOP.

  • @oliverriis-vestergaardmlle2962
    @oliverriis-vestergaardmlle2962 Год назад +2

    I would love to see the performance difference doing it this way

    • @NoBoilerplate
      @NoBoilerplate  Год назад +2

      Zero.
      Enums, like so many things in Rust, are a zero-cost abstraction, there is no runtime penalty.
      Rust is WILD: You can absolutely have your cake and eat it - check this video of mine on this topic: ruclips.net/video/4dvf6kM70qM/видео.html

  • @Adowrath
    @Adowrath Год назад +1

    It's interesting that you bring up the ORM vs. DAL divide -- I have personally not once ever heard of the term DAL before, and even after googling it a little, I still fail to see how it is really an opposite to an ORM in any way.

  • @tptodorov123
    @tptodorov123 Год назад +1

    Algebraic data types are great for expressing data models and are understandable even by the business people. Together with Typeclases one can get closer to expressing the “real” world concepts.

    • @NoBoilerplate
      @NoBoilerplate  Год назад

      Absolutely! Rust's Enums and Traits get me very close to the Haskell dream

  • @xixiaofin
    @xixiaofin 11 месяцев назад +1

    world needs simple yet powerful demo examples like supermario!

  • @snudget
    @snudget 9 месяцев назад +2

    No super position in Rust. The cat is either dead or alive.

  • @Payneonline
    @Payneonline Год назад +2

    When talking about disadvantages of OOP, I was surprised you haven't mentioned Rust approach to modeling relationships through shared behavior, aka traits. Guess that's for another video

    • @NoBoilerplate
      @NoBoilerplate  Год назад +2

      inherited behaviour not attributes, yeah, another video for sure!

  • @haarmegiddo
    @haarmegiddo Год назад +4

    While I find the Mario example a great representation of how great Rust enums with the match expression can be, I think that the base assumption of the video about OOP are completely unrealistic and very biased, and the examples in the video do not address at all how to solve valid inheritance problems in Rust.
    For some cases composition is certainly the way to go over inheritance.
    But anyone who has tried to implement a complex UI in Rust has experienced some of Rust disadvantages and shortcomings based on the facts that it doesn't support OOP and inheritance and that it has all those strict rules in place. There are domains where inheritance is clearly the most elegant and intuitive way of approaching an issue. Selling that Rust is the best tool for every job and dismissing an entire paradigm just because it doesn't fit most of your use cases is not really an objective take at the subject, and is plainly misleading.
    The jungle->gorilla->banana analogy is mostly a product of bad use of OOP and not of OOP itself. The truht is that OOP languages in general don't have the strict checks and safeguards in places as Rust does, and so more mistakes are possible. But that doesn't mean you can't write good, clean and working implementations in those languages and paradigms if you know what you are doing.

    • @NoBoilerplate
      @NoBoilerplate  Год назад

      I think the source on that section explains it better than I cscalfani.medium.com/goodbye-object-oriented-programming-a59cda4c0e53

    • @KohuGaly
      @KohuGaly Год назад

      Except rust does support both OOP and inheritance. Traits can inherit from one another and can have blanket implementations. Modules and structs can have public and private members, hiding implementation details behind public interface. Rust also has both parametric and ad-hoc polymorphism with generics (+ trait bounds) and dyn objects respectively.
      It's not like the traditional "Classes with inheritance" feature was left out for shits and giggles. Nearly every language that has traditional classes has at some point also acquired interfaces (aka. traits), generics (aka. templates with interface restriction), modules/namespaces and lambdas. And it has done so specifically to address the deficiencies in features that classes provide.
      The jungle-gorilla-banana analogy is not a product of bad use of OOP. It's a product of idiomatic use of classes. The main feature of a class, is that it implicitly and eagerly pulls in all the state and functionality of the whole chain of parent classes, while also making it harder to customize what gets pulled in (ie. multiple inheritance is either not allowed or is suffers from poor conflict resolution). It is extremely rare that this is the exact thing you want to happen, and extremely common that this is the exact thing you want to avoid. (complex UI being prime example of an exception)
      The inheritance hierarchy is entirely upside down. In practice you usually want the exact opposite - an object implementing a tree (or DAG) of interfaces, where some combos of base interfaces automatically provides additional functionality.
      Many people outside of biology don't know this, but the hierarchical structure of taxonomy of life is the main point of evidence that life is not a product of intelligent design. Every organism contains vestigial traits that are only useful in its relatives (often very distant ones), and contains clunky workarounds for lack of features that are elegantly implemented in unrelated organisms. All for the sake of adhering to a strict hierarchy of inheritance.
      Life must be a product of some unguided process, because no intelligent being would design a complex system this way.... except, apparently, an OOP software developer...

  • @MohamedCherifBOUCHELAGHEMdz23
    @MohamedCherifBOUCHELAGHEMdz23 9 месяцев назад +1

    I would make NormalPost has many PostImage and when it comes to data/information modeling.
    Not sure if normal forms applies really in this case, modeling a domain doesn't need to follow DB design.

  • @Rahulkp220
    @Rahulkp220 Год назад +1

    Excellent video yet again. 🎉 Thanks for making RUclips a better place.

  • @makroshlyta
    @makroshlyta 8 месяцев назад +1

    Best state machine description ever!

  • @Ryuu-kun98
    @Ryuu-kun98 7 месяцев назад +2

    OOP != Inheritance.
    Inheritance just sucks!
    But the core idea of OO is bundling data with functions.
    And when coupled with interfaces, OO can be much better than you think!

  • @trejkaz
    @trejkaz Год назад +2

    It cuts me that they didn't just call it `union`. It would describe exactly what it is, while not confusing everyone who comes from all the other different backgrounds where enum means something else entirely.
    We get enough confusion between Java and C# with enums being so different between those two. Did Rust _really_ have to come and pour more fuel on the fire? LOL
    But yes, I rather enjoy this feature. I also enjoy it in Kotlin, where it's called sealed classes. ;)

    • @KohuGaly
      @KohuGaly Год назад

      union was already taken by the actual C-compatible union type. IMHO, enum is a fine name, since it effectively just expands the functionality of C/C++ enums.

  • @unnoticedspacegoat8537
    @unnoticedspacegoat8537 Год назад +2

    What isn’t nice about rust enums is if you have a lot of cases and you want to add all of them a common property then it isn’t a nice experience. I ran intı this when modeling an AST. Sealed classes are much better in this case. A solution in rust could be adding delegated properties. And since we add that we can also add delegated methods(i think there is a github issue about this) and that way newtype pattern would be much nicer to use.

  • @billbennings8990
    @billbennings8990 Год назад +1

    Wooooooooo! New no boilerplate video!

  • @meltingphaserecords
    @meltingphaserecords Год назад +1

    Great videos and info! It's really clear and concise ❤ thank you! Greetings from Cuba.

  • @efkastner
    @efkastner Год назад +1

    This video was *awesome*, thank you!
    I thought the quip about tables existing long before and after OO was maybe too witty to be true and a quick google had me wanting to a “well actually…” comment. Those suck and a little more googling showed that the history of these things is murky and entirely dependent on how you chose to draw the lines. I also don’t think leaving that kind of comment even works since it’d comparing very different “types” of things; the coining of “third normal form” v. the coining of “object oriented programming”: one hasn’t changed since 1971 (3NF) and the other continues to “evolve” since the initial coining around the same time (maybe “mutate” is a better descriptor!).
    No matter what, your point works very well :)

    • @laundmo
      @laundmo Год назад +1

      i believe tables existed long before digital technology, even long before most analogue technology

    • @NoBoilerplate
      @NoBoilerplate  Год назад

      This was what I was thinking. Babylonian trader's ledgers etc :D

  • @sealsharp
    @sealsharp 8 месяцев назад

    Fascinating. As a mostly .Net user I'm a little envious about this.

  • @strange_man
    @strange_man Год назад +1

    i think your channel is my new fav

  • @srgibberd
    @srgibberd Год назад +1

    The fat enums with serialise macros also make it impossible to have invalid messages in client/server communications, in particular webserver/wasm, both written in rust. No need for Ajax or other url scheme, just specify operation as enums with parameters. Compiler prevents invalid message generation, and all messages must be handled