str тип - это неизменяемый тип строки в Rust. У него известен размер и статическое время жизни&'static str. Это тип строковых литералов как тут "hello, world". Он известен на момент компиляции и состоит непосредственно из байт, представляющих строку в UTF-8. То есть является значением. Из-за особенностей UTF-8 количество байт может быть больше чем длина строки. Расширяемым, владеющим, изменяемым типом является тип String. В нем строки так же закодированы в UTF-8. Под него память выделяется в куче во время выполнения. Переменная содержит указатель на начало строки, длину строки и емкость. А &str - это ссылка на строку. В Rust ссылки являются заимствующими. Ссылка на строку является срезом строки(указатель и длина), который может заимствовать и указывать на строку типа str и на строку типа String. То есть работает с обоими типами строк. Причем срез строки может указывать как на всю строку, так и на ее часть.