Avatar ·

Em Rust: qual a diferença entre clone() e to_owned() e quando usar cada um?

Olá, colegas! Comecei a estudar Rust recentemente e estou constantemente confuso com os métodos clone() e to_owned(). Ambos parecem criar uma cópia dos dados, mas a documentação diz que são coisas diferentes. Na prática, vejo que clone() pode ser chamado em qualquer tipo que implemente a trait Clone, enquanto to_owned() só pode ser chamado em tipos com a trait ToOwned. Mas não é a mesma coisa? Aqui está um exemplo específico que me confunde: ```rust let s: &str = "hello"; let a: String = s.to_owned(); let b: String = s.to_string(); // também funciona // Por que não posso escrever s.clone() para obter uma String? // Afinal, clone() retorna &str, não String! ``` Outro exemplo: estou trabalhando com slices. Tenho &[i32] e quero obter Vec. Posso fazer slice.to_owned() — funciona. Mas se fizer slice.clone(), obtenho novamente &[i32], não Vec. Por que isso? Parece-me que to_owned() é um método mágico que "transforma" dados emprestados em dados com propriedade. Já clone() apenas copia