为什么调用者必须使用构造函数而不是直接创建结构?

时间:2017-10-12 13:49:56

标签: rust

请考虑以下Rust代码段from The Rust Programming Language, second edition

pub struct Guess {
    value: u32,
}

impl Guess {
    pub fn new(value: u32) -> Guess {
        if value < 1 || value > 100 {
            panic!("Guess value must be between 1 and 100, got {}.", value);
        }

        Guess {
            value
        }
    }

    pub fn value(&self) -> u32 {
        self.value
    }
}

和相应教程的评论,强调我的:

  

接下来,我们实现了一个名为value的方法,它借用了self,没有任何方法   其他参数,并返回u32。这有时是一种方法   称为 getter ,因为它的目的是从其字段中获取一些数据   把它返还。这种公共方法是必要的,因为value字段   Guess结构是私有的。 value字段是私有的非常重要   使用Guess结构的代码不允许直接设置value:   模块以外的调用者必须使用Guess::new函数创建   Guess的实例,确保Guess无法拥有。{1}}   尚未通过value函数中的条件检查的Guess::new

为什么呼叫者必须使用new功能?他们无法通过执行以下操作来解决Guess.value介于1和100之间的要求:

let g = Guess { value: 200 };

1 个答案:

答案 0 :(得分:10)

仅当Guess结构在与使用它的代码不同的模块中定义时才适用;结构本身是公共的,但它的value字段不是,所以你不能直接访问它。

您可以使用以下示例(playground link)验证它:

use self::guess::Guess;

fn main() {
    let guess1 = Guess::new(20); // works
    let guess2 = Guess::new(200); // panic: 'Guess value must be between 1 and 100, got 200.'
    let guess3 = Guess { value: 20 }; // error: field `value` of struct `guess::Guess` is private
    let guess4 = Guess { value: 200 }; // error: field `value` of struct `guess::Guess` is private
}

mod guess {
    pub struct Guess {
        value: u32,
    }

    impl Guess {
        pub fn new(value: u32) -> Guess {
            if value < 1 || value > 100 {
                panic!("Guess value must be between 1 and 100, got {}.", value);
            }

            Guess {
                value
            }
        }

        pub fn value(&self) -> u32 {
            self.value
        }
    }
}

本书解释了保持结构内容非常私密的基本原理。