问题
In Haskell I could do something like this (example adapted from 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
That would allow me to only expose the Shape type and the newCircle and newRectangle functions.
Does Rust have an equivalent for this?
回答1:
In a general sense, no; Rust does not have private enum constructors. Enums are purely public things.
Structs, however, are not like that, and so you can combine them to make the variants purely an implementation detail:
// 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.
}
I would advise against this as a general practice, however.
来源:https://stackoverflow.com/questions/28090120/can-i-create-private-enum-constructors