Scala 的值类的 Rust 等价物是什么?

Dom*_*kis 2 rust

Scala 的值类提供了一种无需分配运行时对象(Rust 中的结构)即可使用类型系统的方法。我正在寻找 Rust 中的等价物。

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

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

struct Uri { val: String }
Run Code Online (Sandbox Code Playgroud)

这有一个使用有点尴尬的缺点,在String预期的地方不可接受,而且我不确定它的开销。

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

Vic*_*voy 5

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

struct Uri(pub String);
Run Code Online (Sandbox Code Playgroud)

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

简单示例为您提供了一个强类型String

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
}
Run Code Online (Sandbox Code Playgroud)

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

  • FWIW,与包装的结构相比,具有单个字段的结构具有*无* 运行时开销。 (2认同)