【问题标题】:How to overload the 'new' method?如何重载“新”方法?
【发布时间】:2015-01-18 07:54:34
【问题描述】:

我刚开始学习 Rust,我想知道是否有办法重载方法。 起初我创建了一个结构并使用“impl”来实现基本的“新”方法。然后我想用一些参数添加“新”方法,并尝试使用 trait。

以下代码已成功编译,但是一旦我尝试使用带有参数的“新”,编译器就给我一个关于额外参数的错误。 那么我应该如何在 Rust 中重载方法呢?

pub struct Words<'a> {
    pub nouns: Vec<&'a str>,
}

trait Test<'a>{
    fn new(nouns: Vec<&'a str>) -> Self;
}

impl<'a> Words<'a> {
    pub fn new() -> Words<'a>{
        let nouns = vec!["test1", "test2", "test3", "test4"];
        Words{ nouns: nouns }
    }

    pub fn print(&self){
        for i in self.nouns.iter(){
            print!("{} ", i);
        }
    }
}

impl<'a> Test<'a> for Words<'a> {
    fn new(nouns: Vec<&'a str>) -> Words<'a>{
        Words{ nouns: nouns }
    }
}

【问题讨论】:

    标签: struct overloading rust


    【解决方案1】:

    Rust 确实通过 trait 实现了重载,但是你不能改变参数的数量,而且它们的类型只有在 trait 定义中首先声明为泛型时才能改变。

    在像你这样的情况下,通常有一个像 new_with_nouns 这样的方法来专门化你的意思:

    impl<'a> Words<'a> {
        fn new() -> Words { /* ... */ }
        fn new_with_nouns(nouns: Vec<&'a str>) -> Words<'a> { /* ... */ }
    }
    

    对于更复杂的数据结构,new_with_something 模式会导致组合爆炸,构建器模式很常见(这里我假设Words 有一个separator 字段,只是为了演示):

    struct WordsBuilder<'a> {
        separator: Option<&'a str>,
        nouns: Option<Vec<&'a str>>,
    }
    
    impl<'a> WordsBuilder<'a> {
        fn new() -> WordsBuilder<'a> {
            WordsBuilder { separator: None, nouns: None }
        }
    
        fn nouns(mut self, nouns: Vec<&'a str>) -> WordsBuilder<'a> {
            self.nouns = Some(nouns);
            self
        }
    
        fn separator(mut self, separator: &'a str) -> WordsBuilder<'a> {
            self.separator = Some(separator);
            self
        }
    
        fn build(self) -> Words<'a> {
            Words {
                separator: self.separator.unwrap_or(","),
                nouns:     self.nouns.unwrap_or_else(|| {
                    vec!["test1", "test2", "test3", "test4"]
                })
            }
        }
    }
    

    这类似于stdlib's thread::Builder 的工作方式,例如。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-13
      • 1970-01-01
      • 2020-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-20
      相关资源
      最近更新 更多