The primary reason there are so many ways is the Rust ownership and type system.
String is a ‘normal’ mutable UTF-8 string that is allocated on the heap.
&str is either a slice reference pointing to a part of a string or a string literal in read-only memory.
&[u8] is a reference to slice of bytes (so only capable of ASCII characters).
&[u8; N] is a reference to a fixed size slice reference of bytes where the length is encoded in the type.
Vec<u8> is a mutable array of bytes (the former two are immutable in contrast).
&u8 is a reference to a single byte.
OsString is an owned, mutable platform native string in the platform’s preferred representation (e.g. non-zero byte UTF-8 on Linux, non-zero byte UTF-16 in Windows).
OsStr is a borrowed version of an OsString.
Path is a slice that supports operations like obtaining the root element or file name or check if it is absolute or relative or to check if the the file exists in the file system.
PathBuf is an owned, mutable version of the former one.
CString is an owned representation of a string that should be compatible with C (e.g. null terminated and no zero bytes in between). They are handy if you want to call C libraries from Rust code.
CStr is a borrowed version of CString.
&'staticstr is a string slice reference with a static lifetime and is therefore valid for the duration of the entire program (in contrast to slices of Strings that might get de-allocated at some point).
The primary reason there are so many ways is the Rust ownership and type system.
String
is a ‘normal’ mutable UTF-8 string that is allocated on the heap.&str
is either a slice reference pointing to a part of a string or a string literal in read-only memory.&[u8]
is a reference to slice of bytes (so only capable of ASCII characters).&[u8; N]
is a reference to a fixed size slice reference of bytes where the length is encoded in the type.Vec<u8>
is a mutable array of bytes (the former two are immutable in contrast).&u8
is a reference to a single byte.OsString
is an owned, mutable platform native string in the platform’s preferred representation (e.g. non-zero byte UTF-8 on Linux, non-zero byte UTF-16 in Windows).OsStr
is a borrowed version of anOsString
.Path
is a slice that supports operations like obtaining the root element or file name or check if it is absolute or relative or to check if the the file exists in the file system.PathBuf
is an owned, mutable version of the former one.CString
is an owned representation of a string that should be compatible with C (e.g. null terminated and no zero bytes in between). They are handy if you want to call C libraries from Rust code.CStr
is a borrowed version ofCString
.&'static str
is a string slice reference with a static lifetime and is therefore valid for the duration of the entire program (in contrast to slices ofString
s that might get de-allocated at some point).Good explanation. However,
OsString
is not necessarily valid UTF-8/UTF-16 (in thay case, it could simply beString
). The docs describe it pretty well.https://doc.rust-lang.org/std/ffi/struct.OsString.html
I’m not sure this meme really cares to make perfect sense, but I don’t think that’s ever useful…?
A single byte is going to be smaller than a pointer address, so you can just copy the
u8
without loss of efficiency.what memory safety does to a mf