Example: `std::env::var(“SOME_PARAM”).unwrap_or_else(|_| “localhost”.to_string())`
It just seems odd to me, something tells me there is a better way to do this but I couldn’t find it.
Example: `std::env::var(“SOME_PARAM”).unwrap_or_else(|_| “localhost”.to_string())`
It just seems odd to me, something tells me there is a better way to do this but I couldn’t find it.
Yep! My understanding is that `AsRef<str>` is the right way to do this automatic conversion but I learned that by reading library code, not from the standard documentation. It'd be awfully nice if the compiler could do those sorts of conversions automatically; injecting `AsRef` everywhere adds a lot of visual clutter.
I agree!
`fn foo<T: AsRef<str>>(s: T)`
This is so difficult to read, one has to jump back and forth with eyes to make any sense of these. Why couldn't there be easier syntax for "AsReffing"? E.g.
`fn foo(s: @str)`
I invented @-sign there.
``` fn foo(s: impl AsRef<str>) ```
(I'm recalling the lunch conversations from when I sat in the room with all the Rust interns).
~T was Box<T>.
However, one issue here was that they didn't compose in the same way as types today; ~str existed, for example, but was not the exact same as String in terms of memory layout. Conceptually they're the same thing though.
So this is fine:
let host: &str = "localhost";
Because a &str is just a read-only pointer to some characters [1], and you're just setting host to be a pointer to those characters in the read-only section.But this is not:
let host: String = "localhost";
Because a String is not just a pointer, it's a pointer which implies ownership of an allocation on the heap [1]. That means you can modify the contents of a String, and when the String is dropped, that allocation will be freed. You can't just set up a String using a pointer into the read-only section. You need to make an allocation, copy the characters into it, and use that. Which is what str::to_string() does.[1] And a length, but we can ignore that for now.