Rust impl 具有私有字段的默认特征

2023-12-11

当我进行此类设置时,我收到错误:

默认_测试.rs:

mod default_mod;

use default_mod::Point;

fn main() {
    let _p1 = Point::new();
    let _p2: Point = Point {
        z: 1,
        ..Default::default()
    };
}

默认_mod.rs:

pub struct Point {
    x: i32,
    y: i32,
    pub z: i32,
}

impl Point {
    pub fn new() -> Self {
        Point { x: 0, y: 0, z: 0 }
    }
}

impl Default for Point {
    fn default() -> Self {
        Point { x: 0, y: 0, z: 0 }
    }
}

这给出了编译器错误:

default_test.rs:9:7
  |
9 |     ..Default::default()
  |       ^^^^^^^^^^^^^^^^^^ field `x` is private

error[E0451]: field `y` of struct `default_mod::Point` is private

简短版本-我有一个包含公共和私有字段的结构。我想用默认值初始化这个结构,但有时会覆盖它们。

我似乎无法修复这个错误,也没有在互联网或文档上看到任何提到这样的错误的内容。

这让我感到惊讶,因为我认为一个常见的用例是初始化一个结构,并且该结构的某些成员将是私有的,因此您可以隐藏后面的实现细节和接口。

就我而言,私有字段是Vec因为我有一些逻辑需要在向量中添加或删除内容,所以我想将其设为私有,以防止任何人弄乱数据结构。

我在这里有什么选择?


这让我感到惊讶,因为我认为一个常见的用例是初始化一个结构,并且该结构的某些成员将是私有的,因此您可以隐藏后面的实现细节和接口。

问题在于结构更新语法并不像您想象的那样。例如,the book显示以下代码:

let user2 = User {
    email: String::from("[email protected]"),
    username: String::from("anotherusername567"),
    ..user1
};

The ..user1语法填写User我们没有明确指定的字段,例如active: user1.active, signin_count: user1.signin_count. ..后面可以跟一个返回结构的任意表达式,其中Default::default()发挥作用,含义相同User::default()因为一个User是期待。然而,脱糖保持不变,归结为分配各个字段,在任何情况下都不会授予对私有字段的特殊访问权限。

回到你的例子,这段代码:

let p = Point {
    z: 1,
    ..Default::default()
};

是语法糖:

let p = {
    let _tmp = Point::default();
    Point {
        x: _tmp.x, // assigning private field
        y: _tmp.y, // assigning private field
        z: 1,
    }
};

而不是预期的:

// NOT what happens
let p = {
    let _tmp = Point::default();
    p.z = 1; // no private assignment
    _tmp
};

我在这里有什么选择?

The most idiomatic option is to provide a builder for Point. That is also somewhat bulky1, so if you're looking for a simple solution, you could also use Point::default() and set the z attribute manually. The struct update syntax is incompatible with structs with private fields and just not useful for your type.


1 Though there are crates like derive_builder, typed-builder and builder-pattern that take some of the drudgery away.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rust impl 具有私有字段的默认特征 的相关文章

随机推荐

  • 直接从浏览器打印,无需打印弹出窗口[重复]

    这个问题在这里已经有答案了 正如主题中所说 我必须为基于 Web 的应用程序创建一个功能 该功能将允许用户直接发送打印而不提示任何对话框 只需使打印 即单击并打印 变得简单 但不适合我 请建议什么是最好的选择以及我应该如何写它 技术 请建议
  • std::remove 不起作用

    我的测试程序的目标是擦除简单字符串向量中的单元格 如下所示 程序失败 分段错误 static void display std vector
  • 如何使用 PuPHPet 制作 Sequel Pro?

    我刚刚使用 Vagrant 和 Puphpet 设置了一个虚拟机 我知道我有 MySQL 因为我可以mysql在命令行中 我刚刚进行了基本安装 我不知道如何设置我的续集专业版才能访问 我在 Sequel Pro 应用程序上使用 标准 选项
  • Nestjs 到 Azure Windows 应用程序服务 - web.config 设置

    从昨天开始 我一直在尝试将 Nestjs api 部署到 azure 但没有成功 起初 我试图将其推送到 Linux 云服务计划 并能够从 vs code 部署它 在 azure 日志中看到该应用程序已成功启动 但它不会从我的端点返回任何数
  • 迭代简短的固定字符串列表[关闭]

    Closed 这个问题是基于意见的 目前不接受答案 在 C 中迭代简短的文字字符串列表 其中所有元素都是预先知道的 的最有效 优雅 惯用的方法是什么 可以用向量来完成 for auto color std vector
  • 如何以编程方式为 UIButton 提供光泽外观?

    我想为某些 iPhone UIButtons 添加 3D 或光泽外观 但这样做时不使用 PNG 或可拉伸图像 我有很多不同形状和大小的按钮 其中有很多颜色是动态生成的 因此预渲染图像在我的情况下不可行 您将如何以编程方式在这些按钮上绘制光泽
  • 在 catch 处理程序中打印异常回溯的可靠方法?

    我想在我的 C 程序中启用异常的完整日志记录 我想做的就是在 seh catch handler 中捕获软件 硬件异常 然后打印异常的完整回溯 我主要对异常的起源感兴趣 调用堆栈对我来说就足够了 try difficult task exc
  • 如何使用 UIScrollView 实现 UIPageViewController?

    我拿了照片滚动来自苹果网站的示例 并尝试通过复制代码来实现我自己的专辑 现在UIScrollView不可见 我该如何让它出现 我所做的唯一代码更改是创建UIPageViewController 就我而言 这是一个UIViewControll
  • 退出时保存应用程序数据状态

    我有一个包含 24 个字符串的 NSMutableArray 如果用户接到电话或退出应用程序 我需要保存这些数据 我一直在研究很多例子 但由于某种原因似乎无法确定保存数据的最佳方法 24 个字符串对应 24 个按钮及其状态 单击按钮时 它会
  • 在 Sencha Touch 2 中从商店加载轮播?

    有没有人有一个代码示例 可以从商店 在我的例子中是 JSON 商店 加载 Sencha Touch 2 Carousel 组件 我了解如何加载扩展 DataView 的列表 但 Carousel 似乎是一个更难解决的问题 因为它不扩展 Da
  • C# 中 AppDomain 的使用

    C 中 AppDomains 最重要的用途是什么 The 最重要的一个使用的是你的代码必须有一个 即您用 C 编写的所有内容都在AppDomain 这非常重要 p 如果你的意思是额外的应用程序域 当使用插件和其他不受信任的代码时 它允许您隔
  • 是否可以将 html get 请求从 create-react-app 代理到 /graphql ?

    我有一个 create react app 应用程序 在其中通过添加以下内容来启用代理 proxy http localhost 3001 到我的 package json 这对于对 graphql 的 API 请求效果很好 但是当 Web
  • CodeIgniter 未加载页面

    我有一个使用 codeigniter 开发的 Web 应用程序 它在我以前的服务器中运行良好 现在我更改了我的服务器 当我尝试运行该 Web 应用程序时 除了空白屏幕之外什么也没有 当我尝试打开现有链接时http mydomain com
  • 是否有用于创建茎叶图的 pandas 函数

    有没有相当于R的pandasstem 用于为数字创建茎叶图的函数Series 我可以轻松编写一些代码 但想知道我是否错过了精美手册中的某些内容 输出示例 16 070355555588 18 000022233333335577777777
  • java 将字符串月份转换为整数

    如何将月份字符串转换为整数 在单击方法中 我想显示所选的日期 但如果该日期有事件 它应该显示有关该事件的更多信息 检查假期事件的方法需要整数值 这是代码 UPDATED Override public void onClick View v
  • 我如何使用 awk 打印多个分隔符单词? [关闭]

    Closed 这个问题需要调试细节 目前不接受答案 我有一个带有正则表达式分隔符的 awk 我需要提取名字和姓氏的单词 但是这个命令不起作用 awk v OFS t v FS firstName lastName sum 1 2 print
  • 将 Uint8List 转换为文件

    我正在使用图像选择器网络 效果很好 我可以在中显示图像Image memory 但是此图像的格式为 Uintlist8 为了保存在存储需要格式File 我的问题是如何将图像保存在Firebase 存储 网页图像选择器 class Secon
  • 如何生成列表的所有排列?

    如何生成列表的所有排列 例如 permutations permutations 1 1 permutations 1 2 1 2 2 1 permutations 1 2 3 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3
  • 按下按钮时的动画文本转换

    我有 3 种类型的报价 当按下相应的按钮时 如果从类别 1 到类别 2 再到类别 3 则报价会消失 反之亦然 然而 我想让引用消失 即使它们来自同一类别 现在 当引用来自不同类别时 它就会消失 如何才能做到这一点 谢谢 我认为这与按钮有关
  • Rust impl 具有私有字段的默认特征

    当我进行此类设置时 我收到错误 默认 测试 rs mod default mod use default mod Point fn main let p1 Point new let p2 Point Point z 1 Default d