methods - 有没有一种方法可以使用后缀表示法来调用 Rust 中的函数而不需要定义新的特征?

标签 methods rust traits

也许我的术语是错误的,但是有没有一种方法可以使用后缀表示法来调用 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 的特征,我并不真正关心它,并且需要使用 use crate 打开该特征: :Foo 在调用 as_string 之前。有更好的方法来实现这一点吗?而且,需要明确的是,如果可能的话,我希望避免使用 as_string(myvec) 表示法,因为后缀表示法非常适合将命令链接在一起。

最佳答案

这是一种常见的模式!

如果您想向另一个 crate 中定义的类型添加方法,官方的方法是定义一个特征并为该类型实现它。如果该类型来自另一个 crate ,那么这是唯一执行此操作的方法

crate itertools 就是一个常见的例子。它使用一个特征为 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...
}

它是为所有迭代器定义的:

impl<T: ?Sized> Itertools for T where T: Iterator { }

并且,每当您想使用这些额外的方法时,您都可以导入它:

use itertools::Itertools;

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

关于methods - 有没有一种方法可以使用后缀表示法来调用 Rust 中的函数而不需要定义新的特征?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56411302/

相关文章:

java - 麻烦理解java插入节点的方法

java - java中将一个方法的输出传递给另一个方法

generics - Rust image::SubImage,找不到类型为 `put_pixel`的方法吗?

c++ - 想要分配 std::string 但编译器认为是 bool

objective-c - 将方法作为属性调用 Objective-C

rust - 使用方法借用包装在 Option 中的值

创建一个 Rust 共享库,返回一个函数指针结构到 C 主程序

rust - 没有预建的 wasm-opt 二进制文件

rust - 如何使用以迭代器为参数的方法进行动态调度?

c++ - iterator_traits中的嵌套指针类型有什么用?