Метод Rust, который принимает и обрабатывает любые типы строк как неизменяемые и создает новую неизменяемую строку? - PullRequest
0 голосов
/ 28 ноября 2018

Я новичок в Rust.Я хочу написать метод (реализацию trait?), Который принимает любой из String или среза строки, обрабатывает его как неизменяемый и возвращает новую неизменяемую строку.Скажем, foo - это метод, который удваивает любой ввод, который вы ему даете:

let x = "abc".foo(); // => "abcabc"
let y = x.foo(); // => "abcabcabcabc"
let z = "def".to_string().foo(); // => "defdef"

В этом случае меня не волнует безопасность или производительность, я просто хочу, чтобы мой код компилировался для одноразового теста.Если куча растет бесконечно, пусть будет так.Если для этого требуются две реализации свойств, это нормально.

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Скажем, foo - это метод, который удваивает любой ввод, который вы ему даете.

A trait - это очень хороший способ сделать это, так какделает одно общее поведение:

trait Foo {
    fn foo(&self) -> String;
}

... применяется к нескольким типам:

impl Foo for String {
    fn foo(&self) -> String {
        let mut out = self.clone();
        out += self;
        out
    }
}

impl<'a> Foo for &'a str {
    fn foo(&self) -> String {
        let mut out = self.to_string();
        out += self;
        out
    }
}

Использование:

let x = "abc".foo();
assert_eq!(&x, "abcabc");
let z = "shep".to_string().foo();
assert_eq!(&z, "shepshep");

Детская площадка

Вывод является собственной строкой.Независимо от того, является ли это значение неизменным или нет, как обычно для Rust, оно действует только на вызывающем сайте.

См. Также:

0 голосов
/ 28 ноября 2018

Если вы хотите заимствованную строку &str в конце:

trait Foo {
    fn display(&self);
}

impl<T> Foo for T where T: AsRef<str> {
    fn display(&self) {
        println!("{}", self.as_ref());
    }
}

fn main() {
    "hello".display();
    String::from("world").display();
}

Если вы хотите владеть String:

trait Foo {
    fn display(self);
}

impl<T> Foo for T where T: Into<String> {
    fn display(self) {
        let s: String = self.into();
        println!("{}", s);
    }
}

fn main() {
    "hello".display();
    String::from("world").display();
}
...