Generic Traits, Impls, and Slices in Rustlang

Поделиться
HTML-код
  • Опубликовано: 14 окт 2024
  • Generics can be super useful when you don't care about the specifics of a given type aside from very specific requirements. If we inform the Rust compiler that we only care about certain requirements, we can write one implementation that applies to a wide array of types instead of an implementation of a trait for every type.
    This trait implementation can panic! Can you fix the panics caused by out of bounds indexing?
    GitHub: github.com/rus...

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

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

    I was very briefly confused by the name "prefix" when it's more of a subsequence, but other than that it was clear.

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

      yep, especially coming from a linguistics background, it threw me off at the start, but the explanation was otherwise so clear that it didn't matter hahah

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

      Thanks for sharing that. Definitely could've chosen a better name there.

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

      @@chrisbiscardi inside_of() ?
      has() ?
      inside()?

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

    Note that it's possible to use an associated type instead of a generic trait, which has the benefit of being usable as reference, for instance in binds (besides, there is no alternative for T so the generic is redundant and only gives more work to the compiler). The changes are minor in the code (unfortunately it's not possible to post URLs here), just remove the after Prefix, add "type Data;" in the trait definition and "Type Data = T;" in the blanket implementation, then replace the remaining "T"s with "Self::Data".

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

    First channel with such a great deal. After seeing this I felt I don't know anything, I have so much to learn in Rust. Long way to go

    • @FourLowAdventures
      @FourLowAdventures 5 месяцев назад

      Been 8 months since you wrote this, how is it coming along?

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

    I felt like big brain rusty kettle after watching this detailed explanation. Thank you!

  • @10produz90
    @10produz90 Год назад +1

    Awesome explanation. Love that you go over everything in detail

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

    Thanks. This was a really well done video. Your in depth walk-through of the code and types helped a lot. I also thought your example was perfect to get the point across for understanding generics and traits.

  • @chris.davidoff
    @chris.davidoff Год назад +1

    I didn't expect this to make sense but it did after watching it!! thank you!

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

    Good intro! There really mind blowing things you can done with generics, like instead of defining implementations directly for &[T] from your example we can define one for the types for which Deref coercion to &[T] exists. It is one of the most powerful things in type system and a great way to DRY code as alternative to using macros.

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

    Beautiful! Thanks for sharing. Looking forward to more intermediate Rust contents like this. :)

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

    Great walkthrough especially for newbies, like me.

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

    Great content, my favorite Rust youtuber right now!

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

    i love this channel

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

    I like how you named the folder "tmmmmp" 😆

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

      tmmmmp: for when tmp, tmmp, and tmmmp somehow already existed 😆

  • @Shaunmcdonogh-shaunsurfing
    @Shaunmcdonogh-shaunsurfing Год назад

    Excellent video

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

    This is very smart

  • @m-7172
    @m-7172 Год назад +2

    It seems to me, that if we were looking for a subsequence [3, 4, 5] in [1, 2, 3, 4] your program would panic, because (index + prefix.len()) might be larger than the index of the last element in the original vec.

    • @m-7172
      @m-7172 Год назад +3

      This should fix it:
      fn has_prefix(&self, prefix: &[T]) -> bool {
      self.iter()
      .positions(|v| *v == prefix[0])
      .find(|&index| {
      if (self.len() - index) >= prefix.len() {
      let range = index..(index + prefix.len());
      self[range] == *prefix
      } else {
      false
      }
      })
      .is_some()
      }

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

      Congrats, you were the first person to complete the challenge in the description!
      notably prefix[0] could also panic if an empty slice was passed in

    • @m-7172
      @m-7172 Год назад +1

      @@chrisbiscardi ngl I missed both the challenge in the description and the possibility of passing an empty slice. Nevertheless this one should do it:
      fn has_prefix(&self, prefix: &[T]) -> bool {
      self.iter()
      .positions(|v|
      if prefix.is_empty(){
      false
      } else {
      *v == prefix[0]
      }
      )
      .find(|&index| {
      if (self.len() - index) >= prefix.len() {
      let range = index..(index + prefix.len());
      self[range] == *prefix
      } else {
      false
      }
      })
      .is_some()
      }

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

    really neat, thank you for sharing

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

    Is there a reason you can't just use windows() in your trait implementation?

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

      I wanted to show slices and equality is all

  • @OlivierGeorg
    @OlivierGeorg 3 месяца назад

    At 10:00, why is it the same comparing values or references? Can't references be different but values the same?

    • @chrisbiscardi
      @chrisbiscardi  3 месяца назад

      Rust shared reference PartialEq compares the value the reference points to, not the pointer itself.
      doc.rust-lang.org/src/core/cmp.rs.html#1674-1676
      when working with raw pointers you'd use ptr::eq or similar instead: doc.rust-lang.org/std/ptr/fn.eq.html

  • @ewe-studios
    @ewe-studios 8 месяцев назад

    What extension do you use to hide and show the type in vscode or is it part of vscode rust extension? Thanks 🙏

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

      its a plugin called Toggle and I bind the inlay hint hide/show to C-i

    • @ewe-studios
      @ewe-studios 8 месяцев назад

      @@chrisbiscardi sweet, thanks

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

    Prefix|T> has to be in the same file (inline or module) to be able call has_prefix ?

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

      Traits have to be in scope to use their functions yes

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

    The only drawback of using generics is the rustc monomorphisation process… which takes compilation time as it has to generate functions for every type implementing PartialEq right?

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

      My assumption is that the compiler only generates it for concrete types that are actually being used in the code, but I don't actually know

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

      @@andr6192 Yes, this is how it works. The compiler only generates it for concrete types where it's used.

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

    Couldn't you use .any(|window| ...) Instead of .find(|window| ...).is_some()? I guess .any could be faster but I haven't tested it, can be that the compiler just optimizes the unused value away.
    But I believe .any is a little more clear what it is doing (well not a huge difference either way)

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

      yes you could use .any

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

      This is actually a warning by default on clippy.
      warning: called `is_some()` after searching an `Iterator` with `find`
      note: `#[warn(clippy::search_is_some)]` on by default
      But it's listed under complexity, not perf, because it's just for readability and doesn't change the compiled code.

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

    Rustlang? do you mean Rust?

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

      Yup. There's a name conflict between the game Rust and the language Rust, so it can be helpful to differentiate, especially on platforms which have both topics