Комментарии 7
String::from("hello")
а почему был выбран такой способ создания строковых литералов? Почему не просто
s string = "hello"
или хотя бы
s string = string("hello")
let s = String::from("hello"); /
а почему был выбран такой способ создания строковых литералов?
Тут смысл конспекта в создании "экземпляра класса" String
, а не литерала. Экземпляр нужен, чтобы у него "вызвать" drop()
. Каковой вызов важен в заявленном контексте "Управление памятью".
Тут смысл в создании "экземпляра класса"
String
, а не литерала. Экземпляр нужен, чтобы у него "вызвать"drop()
. Каковой вызов важен в заявленном контексте "Управление памятью".
типа литерал это строка которую нельзя менять?
а нельзя такое решить спец. модификатором константности?
если литерал от мутабельная строка-объект отличаются только этим объявлением то как тогда их отличать в коде? Скажем что можно менять а что нет.
мне было бы яснее как-то так
var s string = "hello" // mutable
s const = "hello" // literal
- Литерал:
"I am literal"
- Константа:
const I_AM_CONSTANT: &str = "I am literal";
- Изменяемая переменная:
let mut i_am_mutable_string = String::from(I_AM_CONSTANT);
Всего ведь сразу не расскажешь, про это — в других главах.
типа литерал это строка которую нельзя менять?
Здесь дело не в мутабельности литерального типа (в большинстве современных языков строковые литералы порождают иммутабельные объекты). В C++, к примеру:
const char* literalData = "Hello World!";
std::string myStringObject = literalData; // OK, implicit std::string ctor call
Но в Rust запрещены неявные преобразования типов, в том числе от литерала к String. Хочешь сконструировать объект другого типа? Вызови соответствующую фабрику: String::from или to_string трейта Display.
Вы можете написать 'let s = "hello";' Это создаст вам переменную типа &str которая будет ссылаться на захаркоженную строку в теле вашей программы и это обычно то, что вы хотите. String::from("hello") это просто вызов статического метода у структуры String который аллоцирует место в куче и копирует туда данные из "hello".
from это метод трэйта std::convert::From а String реализует этот трэйт. В FQM представлении этот вызов выглядет так: <String as From<&str>>::from("hello"). Практически все типы в стандартной библиотеке так или иначе реализуют трэйт From. Например тип String еще можно получить из одиночного символа: String::from('a'). Такой подход избавляет от необходимости реализовывать методы с разными именами типа from_str_slice, from_char.
Конспектируем Книгу Rust:: Владение