我感兴趣的是在Rust中有一些功能类似于关键字参数的东西,它们目前不受支持.

对于提供关键字参数的语言,类似这样的情况很常见:

panel.button(label="Some Button")
panel.button(label="Test", align=Center, icon=CIRCLE)

我见过使用builder模式处理这个问题,例如:

ui::Button::new().label("Some Button").build(panel)
ui::Button::new().label("Test").align(Center).icon(CIRCLE).build(panel)

这很好,但与Python中的关键字参数相比,有时有点尴尬.


然而,在Rust中使用impl DefaultOption<..>个成员的 struct 初始化可以得到非常接近于编写关键字参数的东西,例如:

ui::button(ButtonArgs { label: "Some Button".to_string(), .. Default::default() } );

ui::button(ButtonArgs {
    label: "Test".to_string(),
    align: Some(Center),
    icon: Some(Circle),
    .. Default::default()
});

这是可行的,但在try 用作关键字args的上下文中有一些缺点:

  • 必须在参数前面加上struct的名称
    (also needing to explicitly include it in the namespace adds some overhead).
  • 在每个可选参数周围加Some(..)是烦人的/冗长的.
  • 每次用完.. Default::default()美元都有点乏味.

有没有办法减少其中的一些问题,让它更容易地取代关键字访问?

推荐答案

我认为宏是解决这个问题的最好办法.您可以使用builder API,为那些不喜欢builder模式的人提供更简单的基于宏的sugar.用问题中的例子:

pub enum Shape { Circle }
pub enum Alignment { Center }
pub struct Button();

impl Button {
    pub fn new() -> Button {Button()}
    pub fn label(self, x: &str) -> Button { self }
    pub fn align(self, x: Alignment) -> Button { self }
    pub fn icon(self, x: Shape) -> Button { self }
}


macro_rules! button {
    ( $($i:ident = $e:expr),* ) => { 
        {
            let btn = Button::new();
            $(
                btn = btn.$i($e);
            )*
            btn
        }
    };
}

fn main() {
    let my_button = button!(label="hello", align=Alignment::Center, icon=Shape::Circle);
    // Equivalent to
    // let my_button = Button::new().label("hello").align(Alignment::Center).icon(Shape::Circle);
}

Rust相关问答推荐

为什么是!为Rust中的RwLockReadGuard和RwLockWriteGuard实现的发送特征?

带扫描的铁 rust 使用滤镜

为什么Rust函数的移植速度比C++慢2倍?

是否可以使用Rust宏来构建元组的项?

如何在递归数据 struct 中移动所有权时变异引用?

异步函数返回的future 生存期

Rust面向对象设计模式

了解Rust';s特征对象和不同函数签名中的生存期注释

为什么HashMap::get和HashMap::entry使用不同类型的密钥?

从 rust 函数返回 &HashMap

在 Rust 中,在第一个空格上分割字符串一次

当没有实际结果时,如何在 Rust 中强制执行错误处理?

在1.5n次比较中找到整数向量中的最大和次大整数

是否可以在 Rust 中的特定字符上实现特征?

如何在 use_effect_with_deps 中设置监听器内的状态?

只有一个字符被读入作为词法分析器的输入

具有生命周期和以后引用的可变方法

如何制作具有关联类型的特征的类型擦除版本?

相互调用的递归异步函数:检测到循环

如何重写这个通用参数?