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

5 rust

在Haskell中我可以做这样的事情(例子改编自Learn You A Haskell)

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
Run Code Online (Sandbox Code Playgroud)

这将允许我只公开Shape类型newCirclenewRectangle函数.

Rust有同等效力吗?

Chr*_*gan 6

从一般意义上讲,不是;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.
}
Run Code Online (Sandbox Code Playgroud)

但是,我建议不要这样做。

  • 很好的答案,除了“建议反对这个”这句话。 (3认同)
  • 你为什么反对这个建议?因为它看起来很像设计模式? (2认同)
  • @ker:“设计模式”没有固有的弊端。只是这通常不会成为惯用的Rust,尽管可能在某些情况下很适合此(不过我想不出任何附带的例子)。 (2认同)
  • [`std::io::Error`](https://doc.rust-lang.org/src/std/io/error.rs.html#58-75) 使用此模式。 (2认同)