【问题标题】:Convert enum type from Rust to Java将枚举类型从 Rust 转换为 Java
【发布时间】:2014-12-22 13:37:42
【问题描述】:

我有这个在 Rust 中声明 enum 的源代码,但我不明白。在 Java 中它的等价物是什么?

pub enum BoxType<'a> {
    BlockNode(&'a StyledNode<'a>),
    InlineNode(&'a StyledNode<'a>),
    AnonymousBlock,
}

其中:BlockNodeInlineNode 是类。

编辑Ionuț G. Stan提供的答案范围内,如何使用他提出的代码来拥有以下代码的功能。

match self.box_type {
    BlockNode(node) => node,
    InlineNode(node) => node,
    AnonymousBlock => panic!("Anonymous block box has no style node")
}

【问题讨论】:

  • 请注意,Java 中没有行对行等效。此代码使用生命周期,这是 Java 不需要的功能,因为它是一种垃圾收集语言。
  • 另一个问题实际上是 Java 中的枚举是枚举(命名常量的集合),而 Rust 中的枚举实际上是标记的联合,或者代数数据类型。虽然标记的联合可以很容易地表示普通的枚举,但反之则不然。在类 Java 语言中,ADT 通常使用类层次结构建模。

标签: java enums rust


【解决方案1】:

最接近的等价物不是枚举,而是类层次结构和访问者(模仿 Rust 中的模式匹配部分):

public interface BoxType {
  public <R> R accept(BoxTypeVisitor<R> visitor);
}

public class BlockNode implements BoxType {
  public final StyledNode styledNode;

  public BlockNode(StyledNode styledNode) {
    this.styledNode = styledNode;
  }

  @Override
  public <R> R accept(BoxTypeVisitor<R> visitor) {
    visitor.visit(this);
  }
}

public class InlineNode implements BoxType {
  public final StyledNode styledNode;

  public InlineNode(StyledNode styledNode) {
    this.styledNode = styledNode;
  }

  @Override
  public <R> R accept(BoxTypeVisitor<R> visitor) {
    visitor.visit(this);
  }
}

public class AnonymousBlock implements BoxType {
  @Override
  public <R> R accept(BoxTypeVisitor<R> visitor) {
    visitor.visit(this);
  }
}

public interface BoxTypeVisitor<R> {
  public R visit(BlockNode box);
  public R visit(InlineNode box);
  public R visit(AnonymousBlock box);
}

正如@Shepmaster 在评论中所说,请注意'a 部分没有等效项。这是 Java 不需要的 Rust 特性,因为 Java 总是使用 GC。

更新

如何移植模式匹配部分。使用提供的访问者界面:

StyledNode styledNode = boxType.accept(new BoxTypeVisitor<StyledNode> {
  @Override
  public StyledNode visit(BlockNode box) {
    return box.styledNode;
  }

  @Override
  public StyledNode visit(InlineNode box) {
    return box.styledNode;
  }

  @Override
  public StyledNode visit(AnonymousBlock box) {
    throw new RuntimeException("Anonymous block box has no style node");
  }
});

【讨论】:

  • 谢谢,我已经用新的小要求更新了这个问题。你能帮我吗?
  • @lonut 太棒了,最后一件事,学习更多关于 Java 中的这些概念。我应该学什么?
  • @Adham 抱歉,我没有一个资源可以指点您。一般来说,学习函数式编程。这将挑战您当前的一些信念/技能。您将开始看到新模式并提炼新知识。
  • @lonut T 是什么意思?
  • @Adham 抱歉,应该是 &lt;R&gt; R,它代表访问者累积/产生的r结果。
猜你喜欢
  • 2021-01-04
  • 2010-10-11
  • 1970-01-01
  • 2023-02-21
  • 2010-12-21
  • 1970-01-01
  • 2012-09-30
相关资源
最近更新 更多