pub trait Build {
// Required method
fn build() -> Self;
}Expand description
§Build Trait
- 构造方法封装: Build trait 需要在实现了它的结构体或枚举中提供 .build() 方法,这个方法会启动并执行所有需要收集用户输入的操作。
- 嵌套与递归: 当结构体或枚举中的某个字段使用了 SubAsker 特性时,表明该字段也是一个实现了 Build trait 的类型。通过调用 .build() 方法,可以递归地收集这些嵌套结构中的信息。
- 简化输入流程: 使用 Build trait 可以避免逐个调用每个字段对应的 .asker() 和 .finish() 方法,而是通过一次 .build() 调用来完成整个对象实例化过程,使得代码更简洁且易于管理。
- 统一接口: 所有作为子询问器使用的结构体都需要实现 Build trait,这保证了不同层次的对象都能遵循一致的构建逻辑。
§Example
#![allow(unused)]
use dialogue_macro::{Asker, Build, EnumAsker};
#[derive(Debug, Asker)]
#[asker(theme = "dialogue_macro::ColorfulTheme")]
struct UserInput {
username: String,
is_student_status: bool,
educational_institution: String,
#[asker(SubAsker)]
detailed_info: DetailedUserInfo,
#[asker(SubAsker)]
choice: EnumSelection,
}
#[derive(Debug, Clone, Asker)]
struct DetailedUserInfo {
email_address: String,
age: u8,
}
#[derive(Debug, EnumAsker, Clone)]
enum EnumSelection {
OptionD,
OptionE,
OptionF,
}
impl Build for DetailedUserInfo {
fn build() -> Self {
Self::asker()
.email_address("请提供您的邮箱地址")
.age("请输入您的年龄")
.finish()
}
}
fn main() {
let collected_user_input = UserInput::asker()
.username("请输入用户名")
.is_student_status("您是否是学生身份?")
.educational_institution("请输入您的学校名称")
.detailed_info()
.choice()
.finish();
println!("{:?}", collected_user_input);
}
Required Methods§
Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.