Methods 有没有一种方法可以使用后缀符号在Rust中调用函数而不定义新特性?

Methods 有没有一种方法可以使用后缀符号在Rust中调用函数而不定义新特性?,methods,rust,traits,Methods,Rust,Traits,也许我的术语是错误的,但是有没有一种方法可以在不定义新特性的情况下使用后缀符号来调用Rust中的函数?基本上,我有一个&str向量,我想把它们转换成一个符号为myvec.as_string的字符串。目前,我可以用代码来做这件事 trait Foo { fn as_string(&self) -> String; } impl Foo for Vec<&str> { fn as_string(&s

也许我的术语是错误的,但是有没有一种方法可以在不定义新特性的情况下使用后缀符号来调用Rust中的函数?基本上,我有一个&str向量,我想把它们转换成一个符号为myvec.as_string的字符串。目前,我可以用代码来做这件事

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

impl Foo for Vec<&str> {  
    fn as_string(&self) -> String {
        let mut mystr = self
            .iter()
            .fold(String::new(),|sum,s| format!("{}{}:", sum, s));
        mystr.pop();
        mystr
    }
}

fn main() {
    let my_vec = vec!["bar", "buz", "baz"];
    use crate::Foo;       
    println!("{}", my_vec.as_string());
}

也就是说,为了实现这一点,我需要定义一个称为Foo的特性,我并不真正关心这个特性,并且在调用as_字符串之前,需要使用use-crater::Foo打开该特性。有没有更好的方法来实现这一点?而且,为了清楚起见,如果可能的话,我想避免使用stringmyvec表示法,因为后缀表示法非常适合将命令链接在一起。

这是一种常见的模式

如果您想向在另一个板条箱中定义的类型添加方法,那么正式的方法是定义一个trait并为该类型实现它。如果类型来自另一个板条箱,则这是唯一的方法

一个普遍存在的例子是板条箱,它使用一个特性向std::iter::Iterator的每个现有实现添加有用的方法

Itertools的工作原理与您描述的一样。有一个特性声明了许多方法:

pub trait Itertools : Iterator {
    fn interleave<J>(self, other: J) -> Interleave<Self, J::IntoIter>
        where J: IntoIterator<Item = Self::Item>,
              Self: Sized
    {
        interleave(self, other)
    }

    // etc...
}
并且,无论何时,只要您想使用这些额外的方法,就可以导入它:

use itertools::Itertools;

let it = (1..7).interleave(vec![-1, -2]);
itertools::assert_equal(it, vec![1, -1, 2, -2, 3, 4, 5, 6]);

这是一个常见的模式

如果您想向在另一个板条箱中定义的类型添加方法,那么正式的方法是定义一个trait并为该类型实现它。如果类型来自另一个板条箱,则这是唯一的方法

一个普遍存在的例子是板条箱,它使用一个特性向std::iter::Iterator的每个现有实现添加有用的方法

Itertools的工作原理与您描述的一样。有一个特性声明了许多方法:

pub trait Itertools : Iterator {
    fn interleave<J>(self, other: J) -> Interleave<Self, J::IntoIter>
        where J: IntoIterator<Item = Self::Item>,
              Self: Sized
    {
        interleave(self, other)
    }

    // etc...
}
并且,无论何时,只要您想使用这些额外的方法,就可以导入它:

use itertools::Itertools;

let it = (1..7).interleave(vec![-1, -2]);
itertools::assert_equal(it, vec![1, -1, 2, -2, 3, 4, 5, 6]);

后缀符号的意思是定义和调用一个方法?“你可以不带特征就这样做,不是吗?啊,但我明白了,外部类型是不行的。”塞尔吉奥图兰采夫说得没错。我尝试了impl-Vec,但收到了在crate外部定义的类型的编译错误impl。因此,要明确的是,这是针对我没有定义的类型,比如上面的Vec。只需补充一点,您的示例已经可以使用who的定义来完成,可以发现定义特征有什么错?后缀符号的意思是定义和调用方法?“你可以不带特征就这样做,不是吗?啊,但我明白了,外部类型是不行的。”塞尔吉奥图兰采夫说得没错。我尝试了impl-Vec,但收到了在crate外部定义的类型的编译错误impl。因此,要明确的是,这是针对我没有定义的类型,比如上面的Vec。只是要补充一点,您的示例已经可以使用who的定义来完成,可以发现定义特征有什么错?