←back to thread

177 points signa11 | 7 comments | | HN request time: 0.001s | source | bottom
Show context
amelius ◴[] No.42160877[source]
Yes, and people should stop using Rust for projects that do not require a systems programming language.

Know what tool to pick.

replies(4): >>42160896 #>>42160922 #>>42161000 #>>42163093 #
1. eYrKEC2 ◴[] No.42160922[source]
It's a high level language with algebraic data types and fantastic type checking. I'll use it where ever I darn well please.
replies(1): >>42160951 #
2. runeblaze ◴[] No.42160951[source]
Sometimes I write Rust with Arc and Rc sprinkled everywhere because I just need a dialect of OCaml.
replies(1): >>42161177 #
3. estebank ◴[] No.42161177[source]
The only thing that's really missing is deref patterns so that you can pattern match on an Arc<T> with a T pattern.
replies(1): >>42165742 #
4. goku12 ◴[] No.42165742{3}[source]
Shouldn't this be possible already? Deref is implemented for Arc<T>.

[1] https://doc.rust-lang.org/std/sync/struct.Arc.html#impl-Dere...

[2] https://rust-lang.github.io/rfcs/2005-match-ergonomics.html

replies(1): >>42166761 #
5. estebank ◴[] No.42166761{4}[source]
I mean having the following work:

  match Arc::new("hello") {
      "hi" => {}
      "hello" => {}
      _ => {}
  }
It is an extension of match ergonomics, called deref patterns. There's some experimental code to make it work for `String` to `&str` (`if let "hi" = String::from("hi") {}`), but it is not anywhere close to finished. The final version will likely have something like a `trait DerefPure: Deref {}` signaling trait. There is disagreement on whether giving users the possibility to execute non-idempotent, non-cheap behavior on `Deref` and allow them to `impl DerefPure` for those types would be a big enough foot-gun to restrict this only to std or not.
replies(1): >>42167408 #
6. sfink ◴[] No.42167408{5}[source]
What's the difference and advantage, other than less typing, of this over:

     match *Arc::new("hello").as_ref() {
      "hi" => {}
      "hello" => {}
      _ => {}
(Sorry, Rust newbie here)
replies(1): >>42168568 #
7. estebank ◴[] No.42168568{6}[source]
Patterns can be arbitrarily complex. If you have

  struct Foo {
      bar: Arc<String>,
  }
Then it's the difference between today's

  if let Foo { bar } = val {
      if &*bar == "hi" {
      }
  }
And the potential future

  if let Foo { bar: "hi" } = val {}
The more complex the pattern, the bigger the conciseness win and levels of nesting you can remove. This comes up more often for me with `Box`, in the context of AST nodes, but because I use nightly I can use `box` patterns, which is the same feature but only for `Box` and that will never be stabilized.