我可以创建私有枚举构造函数吗?

2024-01-30

在 Haskell 中我可以做这样的事情(示例改编自学习 Haskell http://learnyouahaskell.com/making-our-own-types-and-typeclasses#algebraic-data-types)

module Shapes (
    Shape,
    newCircle,
    newRectangle,
    ... -- other functions for manipulating the shapes
)

data Shape = Circle Int Int Float       -- x, y, radius
           | Rectangle Int Int Int Int  -- x1, y1, x2, y2

newCircle :: Float -> Shape
newCircle r = Circle 0 0 r

newRectangle :: Int -> Int -> Shape
newRectangle w h = Rectangle 0 0 w h

... -- other functions for manipulating the shapes

这将允许我只暴露Shape类型和newCircle and newRectangle功能。

Rust 有类似的东西吗?


从一般意义上来说,不是; Rust 没有私有枚举构造函数。枚举是纯粹的公共事物。

然而,结构不是这样的,因此您可以将它们组合起来以使变体纯粹是实现细节:

// This type isn’t made public anywhere, so it’s hidden.
enum ShapeInner {
    // Oh, and let’s use struct variants ’cos they’re cool.
    Circle {
        x: i32,
        y: i32,
        radius: f64,
    },
    Rectangle {
        x1: i32,
        y1: i32,
        x2: i32,
        y2: i32,
    },
}

// Struct fields are private by default, so this is hidden.
pub struct Shape(ShapeInner);

impl Shape {
    pub fn new_circle(radius: f64) -> Shape {
        Shape(Circle { x: 0, y: 0, radius: radius })
    }

    pub fn new_rectangle(width: i32, height: i32) -> Shape {
        Shape(Rectangle { x1: 0, y1: 0, x2: width, y2: height })
    }

    // “match self.0 { Circle { .. } => …, … }”, &c.
}

不过,我建议不要将此作为一般做法。

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

我可以创建私有枚举构造函数吗? 的相关文章

随机推荐

  • LibGDX 网格高度图法线和灯光

    我正在尝试让网格法线和灯光在 LibGDX 项目中工作 我已经有了从高度图纹理像素生成的纹理网格 问题是我无法正确点亮法线 另外 我不能 100 确定我在 TerrainChunk 类中正确设置了法线顶点 这是主类代码 package co
  • staggerChildren 与成帧器运动

    我在使成帧器运动 staggerChildren 过渡到处理简单的项目列表时遇到一些问题 它基本上允许子组件的动画交错 我为父容器和子容器设置了这样的动画属性 const container hidden opacity 0 show op
  • ArrayCollection:以表单形式检索集合

    我使用 Symfony2 制作了一个 Web 应用程序 其中用户与实体 Mission 具有数组关联 ManytoMany 用户可以通过表单上传实体 product 表单传递的数据之一是与用户关联的任务 每个用户都有不止一个任务 因此 当他
  • 页脚在底部有CSS网格吗?想不通吗?

    我看过其他教程 了解如何在内容很少时使用 css 网格使页脚粘在底部 但我无法弄清楚 如果你能帮忙 那就太好了 我正在学习 css grid 我花了几天时间断断续续地试图弄清楚它 margin 0 padding 0 color fffff
  • 错误:“文件‘/MasterPages/MainMaster.master’不存在。” (是的,这个文件确实存在!)

    我刚买了一台新的台式电脑 操作系统为 Windows 7 Pro 我在这台新计算机上安装了 Visual Studio 2008 并尝试打开以前存在的 ASP NET 3 5 解决方案 该解决方案在我以前的计算机上显示得非常好 以前的计算机
  • Chrome.system.cpu API 使用情况

    是否可以使用 chrome system cpu api 获取当前 CPU 负载 我特别不知道如何将返回的数字转换为总电流负载的百分比 我发现了这一点 但不太确定如何实现 调用者可以通过进行两次调用 减去时间并除以总时间差来计算负载分数 h
  • 减小折叠菜单的宽度

    在下面的代码中 当单击折叠菜单时 会提供一个与页面全宽的下拉菜单 div class row div class col sm 8 div class navbar header div div div
  • Angular 2 双向数据绑定不起作用

    我在 Angular 2 中获取自定义双向数据绑定时遇到问题 文档表明盒子模型中的香蕉 只是语法糖 但是在我的示例中 这种方式不起作用 而且时间更长方法的工作原理
  • ggplot 中轴/变量标签的键值映射

    我经常使用具有 R 友好 程序员友好 列名称的数据框 通常没有空格和 或缩写 在进行分析时懒于输入全名 例如 ir lt data frame sp iris Species sep len iris Sepal Length sep wi
  • Long 不能取消引用

    我几乎做了一切来解决 长不能取消引用 这个恼人的问题 但一切都解决了 因此 有人可以帮助我吗 问题是当我检查程序是否超时时if System currentTimeMillis longValue finish 比较不起作用 public
  • Sql ServerPreparedStatement为SQL“in(?)”子句设置参数

    我有一个sql看起来像这样 SELECT FROM T TABLE WHERE ID IN 我想设置参数IN via PrepareStatement 我认为所需的方法如下所示 prepareStatement setList 1 Arra
  • 为什么不是 scanf("%*[^\n]\n");和 scanf("%*[^\n]%*c");清除悬挂的换行符?

    拨打电话后scanf d variable 我们留下了一个换行符挂在stdin 应在调用之前清除fgets 或者我们最终给它提供一个换行符并使其过早返回 我找到了建议使用的答案scanf n c 第一次致电后scanf放弃换行符和其他建议使
  • oracle查询比较表中具有相同id的所有行

    需要一个 sql 查询来生成具有相同 id 的状态为完整的记录 例如 mytable是包含各种记录的表名 我们需要找到同一 ID 的所有状态为完整的 ID id status 12 complete 12 required 12 activ
  • Google 网站管理员工具 API:通过 OAUTH2 下载查询

    我正在尝试使用 Google 的网站管理员工具 API 下载最近搜索查询的 CSV 文件 我知道如何使用他们的 Python 示例来做到这一点http googlewebmastercentral blogspot com 2011 12
  • 如何向 .DecimalPad iOS 键盘添加减号?

    如何向 DecimalPad 类型 iOS 键盘添加减号 就像下面链接中的应用程序一样 如果我错了 请纠正我 但这对我来说似乎不是一个自定义键盘 它看起来像是苹果公司的默认十进制键盘 带减号的十进制键盘 https i stack imgu
  • Apache 基准 HTTPS 失败

    我在 Ubuntu 虚拟机中使用 Apache 2 4 2 我用它来加载测试 将请求发送到某个 HTTPS url 失败的请求数为零 但我的请求都无法真正得到处理 已经在数据库中查找 使用相同的url 通过浏览器调用它就可以了 数据库已更新
  • Python 中按年月分组并删除所有 NaN 的列

    基于来自的输出数据帧这个链接 https stackoverflow com questions 69937232 groupby year month and find top n smallest values columns in p
  • 原子属性的 setter 和 getter

    对于以下属性值 自动生成的 getter 和 setter 是什么样的 in h interface MyClass NSObject private NSString value property retain NSString valu
  • Qt/C++ 如何迭代给定类对象的 QMetaObject 属性/数据类型?

    在 C Java 中 我使用反射来读取类的属性 我尝试过使用 Qt 但不知道是否能正确解决我的问题 一个简单的 Person 类头 注意 3 个属性 id fname lname ifndef PERSON H define PERSON
  • 我可以创建私有枚举构造函数吗?

    在 Haskell 中我可以做这样的事情 示例改编自学习 Haskell http learnyouahaskell com making our own types and typeclasses algebraic data types