Scala's value classes提供了一种在不分配运行时对象的情况下使用类型系统的方法(在Rust的情况下为结构)。我正在寻找Rust中的等价物。
我想要介绍的用例是通过用Uri
而不是String
注释相关签名来传递代表URI的字符串,理想情况下,使用此{{} 1}}当预期Uri
时。所有这些都是最小的开销。
一个明显的解决方案是使用带有一个字段的结构:
String
这样做的缺点是使用稍微笨拙,在预期struct Uri { val: String }
的情况下是不可接受的,我不确定它的开销。
在Rust中有类似于Scala的值类吗?是否有其他一些机制可以促进这种用例?
答案 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
}
强类型的关键是你无法隐式转换它们,所以这需要代码编写器编写显式代码。