带有Rust结构的枚举器

时间:2014-11-15 13:07:55

标签: rust

我想将此代码转换为Rust

enum Direction {
    EAST(0), WEST(180), NORTH(90), SOUTH(270);

    private Direction(final int angle) {
        this.angle = angle;
    }

    private int angle;

    public int getAngle() {
        return angle;
    }
}

//using
Direction d1 = Direction.EAST;
Direction d2 = Direction.SOUTH;

所以这就是我尝试过的:

enum Direction {
    East(int), 
    West(int), 
    North(int), 
    South(int);
}

impl Direction {
  ???
  fn new() -> Direction // incorrect
}

然后我被卡住了。我接下来该怎么办?

3 个答案:

答案 0 :(得分:11)

以下是您的Java枚举的内容:

+-----+-----+
| tid |   0 |
+-----+-----+
+-----+-----+
| tid |  90 |
+-----+-----+
+-----+-----+
| tid | 180 |
+-----+-----+
+-----+-----+
| tid | 270 |
+-----+-----+

tid对于所有四个方向都是相同的,并标识类型Direction及其方法。以下是使用您的Rust代码East(0)Noth(90)West(180)South(270)的方式:

+-------+-----+-----+-----+-----+
| East  |   0 |     |     |     |
+-------+-----+-----+-----+-----+
+-------+-----+-----+-----+-----+
| North |     |  90 |     |     |
+-------+-----+-----+-----+-----+
+-------+-----+-----+-----+-----+
| West  |     |     | 180 |     |
+-------+-----+-----+-----+-----+
+-------+-----+-----+-----+-----+
| South |     |     |     | 270 |
+-------+-----+-----+-----+-----+

每个构造函数都有一组字段(在这种情况下,每个int)是不同的。实际上,由于任何给定的Direction最多只有一个East/North/East/West,因此在任何时间点只使用一组字段,并且它们使用相同的内存(因此Direction实际上只占用两个字)。

但从概念上讲,上述内容是准确的,并说明了Rust版本的两个问题。首先,存在重复:构造函数标记(N / E / S / W)对于所有四个都已经不同,因此int字段是多余的。其次,概念上int中的Northint中的South不同,即使它们对所有North(214)具有完全相同的含义。此外,没有什么可以阻止创建East(180)enum Direction { North, East, South, West } impl Direction { fn get_angle(self) -> int { match self { East => 0, West => 180, North => 90, South => 270, } } }

最直接的翻译是:

get_angle

方向隐含在枚举标记中,并使用{{1}}提取。

答案 1 :(得分:9)

德尔南的回答是完全正确的,你可能应该采用它,但还有另一种方法。 Rust枚举也可以与C枚举类似,其中枚举常量本质上是数值常量。 Rust允许你写这样的东西:

enum Direction {
    East = 0,
    North = 90,
    West = 180,
    South = 270
}

然后您可以将枚举值用作具有显式强制转换的数字:

let value = South as uint;
println!("{}", value);  // prints 270

这是有效的,因为枚举本质上是带有隐藏鉴别字段的结构,这是一个数字。因此,没有带参数的变体的枚举值仅包含该鉴别符字段。它的值可以通过数字转换访问,您可以在枚举定义中为不同的枚举变量设置具体值。

我的意思是,这只有在需要整数时才有效。你不能用这种方式获得字符串或浮点数,就像你可以用Java做的那样(其中枚举变体只是具有任意字段的常规对象)。如果你需要它,你将不得不使用单独的getter方法,就像在delnan的答案中一样。

答案 2 :(得分:0)

编辑:我不知道Java枚举已关闭。因此,你应该选择德尔南的答案。

我想你想要这样的东西:

pub struct Direction {
    angle: int,
}

impl Direction {
    pub fn new(angle: int) -> Direction {
        Direction {
            angle: angle,
        }
    }

    pub fn get_angle(&self) -> int {
        self.angle
    }
}

pub const EAST: Direction = Direction { angle: 0 };
pub const WEST: Direction = Direction { angle: 180 };
pub const NORTH: Direction = Direction { angle: 90 };
pub const SOUTH: Direction = Direction { angle: 270 };

要阐述:Rust中的enum用于列出一组有限的不相交变量。换句话说,如果enum只能 DirectionEastWest或{{North,则South是合适的1}}而没有别的。