little_ferris@programming.dev to Rust@programming.devEnglish · edit-24 months agoWhat are some mind blowing Rust tricks?message-squaremessage-square20fedilinkarrow-up10arrow-down10file-text
arrow-up10arrow-down1message-squareWhat are some mind blowing Rust tricks?little_ferris@programming.dev to Rust@programming.devEnglish · edit-24 months agomessage-square20fedilinkfile-text
If we were to create a Rust version of this page for Haskell, what cool programming techniques would you add to it?
minus-squaretuna@discuss.tchncs.delinkfedilinkarrow-up0·4 months agoSomething i didnt know for a long time (even though its mentioned in the book pretty sure) is that enum discriminants work like functions #[derive(Debug, PartialEq, Eq)] enum Foo { Bar(i32), } let x: Vec<_> = [1, 2, 3] .into_iter() .map(Foo::Bar) .collect(); assert_eq!( x, vec![Foo::Bar(1), Foo::Bar(2), Foo::Bar(3)] ); Not too crazy but its something that blew my mind when i first saw it
minus-squaretatterdemalion@programming.devlinkfedilinkarrow-up0·4 months agoClippy will warn you if you don’t use this feature.
minus-squareEphera@lemmy.mllinkfedilinkarrow-up0·4 months agoThis works with anything that one might call “named tuples”. So, you can also define a struct like so and it’ll work: struct Baz(i32); On the other hand, if you define an enum variant with the normal struct syntax, it does not work: enum Foo { ... Qux { something: i32 } //cannot omit braces }
minus-squarelittle_ferris@programming.devOPlinkfedilinkEnglisharrow-up0·4 months agoYea it’s like when we writeSome(2). It’s not a function call but a variant of the Option enum.
minus-squarebarsoap@lemm.eelinkfedilinkarrow-up0·4 months agoEnum constructors are functions, this typechecks: fn foo<T>() { let f: fn(T) -> Option<T> = Some; } I was a bit apprehensive because rust has like a gazillion different function types but here it seems to work like just any other language with a HM type system.
Something i didnt know for a long time (even though its mentioned in the book pretty sure) is that enum discriminants work like functions
#[derive(Debug, PartialEq, Eq)] enum Foo { Bar(i32), } let x: Vec<_> = [1, 2, 3] .into_iter() .map(Foo::Bar) .collect(); assert_eq!( x, vec![Foo::Bar(1), Foo::Bar(2), Foo::Bar(3)] );
Not too crazy but its something that blew my mind when i first saw it
Clippy will warn you if you don’t use this feature.
This works with anything that one might call “named tuples”.
So, you can also define a struct like so and it’ll work:
struct Baz(i32);
On the other hand, if you define an enum variant with the normal struct syntax, it does not work:
enum Foo { ... Qux { something: i32 } //cannot omit braces }
Yea it’s like when we write
Some(2)
. It’s not a function call but a variant of theOption
enum.Enum constructors are functions, this typechecks:
fn foo<T>() { let f: fn(T) -> Option<T> = Some; }
I was a bit apprehensive because rust has like a gazillion different function types but here it seems to work like just any other language with a HM type system.