Pull to refresh

Comments 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.

Sign up to leave a comment.

Articles