繁体   English   中英

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

[英]Is there a way to use postfix notation to call a function in Rust without defining a new trait?

也许我的术语是错误的,但是有没有一种方法可以使用后缀表示法在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_string之前use crate::Foo打开该特性。 有没有更好的方法可以做到这一点? 而且,要明确一点,我想尽可能避免使用as_string(myvec)表示法,因为后缀表示法非常适合将命令链接在一起。

这是常见的模式!

如果要向另一个包装箱中定义的类型添加方法,则官方方法是定义一个特征并为该类型实现。 如果类型是来自其他箱子,则这是唯一的方法

一个无处不在的例子是板条箱itertools ,它使用特征将有用的方法添加到std::iter::Iterator每个现有实现中。

Itertools就像您描述的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...
}

它为所有Iterator定义:

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]);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM