rust - Scala 的值类在 Rust 中的等价物是什么?

标签 rust

Scala's value classes提供一种在不分配运行时对象(在 Rust 的情况下为结构)的情况下使用类型系统的方法。我正在寻找 Rust 中的等效项。

我想介绍的用例是通过使用类似 Uri 而不是 String 的注释相关签名来传递表示 URI 的字符串,并且,理想情况下,在需要 String 时使用此 Uri。所有这一切都以最小的开销完成。

一个明显的解决方案是使用具有一个字段的结构:

struct Uri { val: String }

这有一个使用起来有点笨拙的缺点,在需要 String 的地方是 Not Acceptable ,而且我不确定它的开销。

Rust 中有没有类似于 Scala 的值类的东西?是否有一些其他机制可以促进此用例?

最佳答案

我相信您正在寻找的是“强类型系统”。在 Rust 中,它用一个带有一个字段(新类型)的元组结构表示:

struct Uri(pub String);

这将创建一个开销最小的强类型。我会说这只是为编译器创建了一个标记,该类型是 Uri 而不是别的。由于这是一个强类型,您不能简单地将 String 传递给它并从中获取 String ,您必须手动进行转换。

Simple exampleString 之上为您提供强类型:

struct Uri(pub String);

fn takes_uri(uri: Uri) {
    println!("URI: {}", uri.0);
}

fn takes_string(uri: String) {
    println!("String: {}", uri);
}

fn main() {
    let uri = Uri("https://stackoverflow.com".to_owned());
    takes_uri(uri);
    // takes_string(uri); // This does not compile
}

强类型的关键是您不能隐式转换它们,因此这需要代码编写者编写显式代码。

关于rust - Scala 的值类在 Rust 中的等价物是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48476002/

相关文章:

generics - 如何结合 std::str::lines 和 std::io::lines?

pointers - 为什么变量的可变性没有反射(reflect)在 Rust 的类型签名中?

rust - 尝试从包含在 RefCell 中的结构中借用 2 个字段时出错

serialization - 序列化元组类型 - 模块 core::tuple 是私有(private)的

string - 如何在 Windows 上将 OsStr 转换为 &[u8]/Vec<u8> ?

rust - 为什么 `*mut T` 实现 `Unwindsafe` 而 `&mut T` 没有?

rust - 在 Rust 中寻找方法实现的来源?

postgresql - 如何在Rust上使用Actix创建POST方法?

rust - 匹配武器 : "mismatched types expected (), found integral variable"

sockets - 使用 read_to_string 时如何停止在新行上?