rust 什么是“结构体'Todo'的字段'id'是私有的”错误?[duplicate]

cbwuti44  于 2022-11-30  发布在  其他
关注(0)|答案(1)|浏览(159)

此问题在此处已有答案

field of struct is private when importing module(2个答案)
10天前关闭。
我想把一个值放在结构中,但是我得到了一个错误,因为它是私有的。我该怎么解决这个问题呢?我把它设置为pub,但是我得到了这个错误。
第一个

fjaof16o

fjaof16o1#

你的struct和were不是同一个模块的一部分,所以声明struct pub是不够的,你必须为字段授予可见性。
这个程序可以很好地编译:

struct Todo {
    id: Option<u32>,
    content: String,
    completed: bool,
}

fn main() {
    let t = Todo {
        id: Some(1),
        content: String::from("やること"),
        completed: false,
    };
    println!("{}", t.content);
}

但这不会:

mod todo {
    struct Todo {
        id: Option<u32>,
        content: String,
        completed: bool,
    }
}    

fn main() {
    let t = todo::Todo {
        id: Some(1),
        content: String::from("やること"),
        completed: false,
    };
    println!("{}", t.content);
}

如果你将pub添加到结构体而不是字段中,那么现在可以从main中看到该结构体,但看不到它的内容.如果你将pub添加到字段中,那么你可以从main中创建该结构体,也可以访问它的字段:

mod todo {
    pub struct Todo {
        pub id: Option<u32>,
        pub content: String,
        pub completed: bool,
    }
}    

fn main() {
    let t = todo::Todo {
        id: Some(1),
        content: String::from("やること"),
        completed: false,
    };
    println!("{}", t.content);
}

如果只生成结构pub,而不生成字段,则可以从main中查看和使用结构,同时防止直接访问其字段:

mod todo {
    pub struct Todo {
        id: Option<u32>,
        content: String,
        completed: bool,
    }
    
    impl Todo {
        pub fn new() -> Self {
            Todo {
                id: Some(1),
                content: String::from("やること"),
                completed: false,
            }
        }
        
        pub fn content(&self) -> String {
            self.content.to_owned()
        }
    }
}    

fn main() {
    let t = todo::Todo::new();
    println!("{}", t.content());
}

如果您尝试直接从main(如Todo {.....}中)而不是使用new()来建立结构,就会发生错误。如果您尝试打印t.content而不是使用content()函式,就会发生错误。

相关问题