• GissaMittJobb
    link
    fedilink
    arrow-up
    13
    ·
    8 months ago

    Since all of the expressions just wrap a None, I wouldn’t be surprised if the transmutes basically get compiled to 0, making the assertion at the end assert_eq!(0 * 0, 0).

    • tatterdemalion@programming.devOP
      link
      fedilink
      arrow-up
      10
      ·
      edit-2
      8 months ago

      Nah these are the actual integer representations. Otherwise you would have Some(None) == Some(Some(None)) which is way too Javascripty for Rust folks.

      • GissaMittJobb
        link
        fedilink
        arrow-up
        3
        arrow-down
        1
        ·
        8 months ago

        That’s kind of wild, I double-checked and it’s true.

        Although I disagree with the second part, the Rust folks wouldn’t care about the in-memory representation as long as the compilation is on point.

        Looking closer at the final enum, I guess it’s because there are nine possible cases for it, making the compiler pack it into 4 bits, with one number representing each? I checked and None is represented as 8, while 7 Somes containing a None is 0 and the full 8 Somes is represented by 1.

        • tatterdemalion@programming.devOP
          link
          fedilink
          arrow-up
          6
          ·
          8 months ago

          the Rust folks wouldn’t care about the in-memory representation as long as the compilation is on point.

          Well I can’t speak for everyone, but Rust is very intentional about supporting things like repr(C). At least some of us care a lot.