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 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
}
强类型的关键是您不能隐式转换它们,因此这需要代码编写者编写显式代码。
关于rust - Scala 的值类在 Rust 中的等价物是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48476002/