我想将此代码转换为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
}
然后我被卡住了。我接下来该怎么办?
答案 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
中的North
与int
中的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)
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
只能 Direction
,East
,West
或{{North
,则South
是合适的1}}而没有别的。