Scala 的值类提供了一种无需分配运行时对象(Rust 中的结构)即可使用类型系统的方法。我正在寻找 Rust 中的等价物。
我想介绍的用例是传递一个表示 URI 的字符串,方法是用类似的东西来注释相关签名Uri而不是String,并且理想情况下,Uri在需要 a 时使用它String。所有这一切都以最小的开销。
一个明显的解决方案是使用具有一个字段的结构:
struct Uri { val: String }
Run Code Online (Sandbox Code Playgroud)
这有一个使用有点尴尬的缺点,在String预期的地方不可接受,而且我不确定它的开销。
有没有类似于 Rust 中 Scala 的值类的东西?是否有其他机制可以促进此用例?
我相信您正在寻找的是“强类型系统”。在 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)
强类型的关键是您不能隐式转换它们,因此这需要代码编写者编写显式代码。