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

时间:2018-01-27 12:54:17

标签: rust

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

我想要介绍的用例是通过用Uri而不是String注释相关签名来传递代表URI的字符串,理想情况下,使用此{{} 1}}当预期Uri时。所有这些都是最小的开销。

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

String

这样做的缺点是使用稍微笨拙,在预期struct Uri { val: String } 的情况下是不可接受的,我不确定它的开销。

在Rust中有类似于Scala的值类吗?是否有其他一些机制可以促进这种用例?

1 个答案:

答案 0 :(得分:4)

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

struct Uri(pub String);

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

Simple example会在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
}

强类型的关键是你无法隐式转换它们,所以这需要代码编写器编写显式代码。