#newtype #inline #kotlin #class #macro #field #transform

inline_newtype

受 Kotlin 的 inline class 启发的 Rust newtype 宏

2 个版本

0.1.1 2022年11月2日
0.1.0 2022年11月1日

#2119 in Rust 模式

MIT 许可证

10KB
111

inline_newtype

受 Kotlin 的 inline class 启发的 Rust newtype 宏。当我们使用

newtype!(NewTypeOne, u32);

它会为您生成结构体

#[derive(Debug, Clone)]
    struct NewTypeOne {
        pub v: u32,
    }

。这里的 v 是默认的公共字段。

use inline_newtype::newtype;
use std::path::PathBuf;
newtype!(UserHomeDirectory, PathBuf);
newtype!(UserRuntimeDirectory, PathBuf);
let user_home_directory = UserHomeDirectory { v: PathBuf::from("hello") };
let user_runtime_directory= UserRuntimeDirectory {v: PathBuf::from("hello")};
fn test_newtype_type_func(user_home_directory: UserHomeDirectory) -> UserHomeDirectory{
         user_home_directory
}
test_newtype_type_func(user_runtime_directory);  // mismatch type

您也可以通过添加 pub 将新类型声明为公共的。

use inline_newtype::newtype;
use std::path::PathBuf;
newtype!(UserHomeDirectory, PathBuf, pub);

如果您想的话,也可以更改字段名。

use inline_newtype::newtype;
use std::path::PathBuf;
newtype!(UserHomeDirectory, PathBuf, path_buf);
let user_home_directory = UserHomeDirectory { path_buf: PathBuf::from("hello")};
assert_eq!(user_home_directory.path_buf, PathBuf::from("hello"));

从一种新类型转换到另一种新类型

use inline_newtype::newtype;
use std::path::PathBuf;
newtype!(UserHomeDirectory, PathBuf);
newtype!(UserRuntimeDirectory, PathBuf);
let user_home_directory = UserHomeDirectory { v: PathBuf::from("hello") };
let user_runtime_directory = UserRuntimeDirectory { v: PathBuf::from("hello") };
fn transform_user_home_to_runtime_directory(
    mut user_home_directory: UserHomeDirectory,
) -> UserRuntimeDirectory {
    let mut runtime_dir = user_home_directory.v;
    runtime_dir.push("runtime_dir");
    UserRuntimeDirectory { v: runtime_dir }
}

您也可以使用花括号来声明新类型。

use inline_newtype::newtype;
use std::path::PathBuf;
newtype! {UserHomeDirectory, PathBuf, path_buf}
let user_home_directory = UserHomeDirectory { path_buf: PathBuf::from("hello") };
assert_eq!(user_home_directory.path_buf, PathBuf::from("hello"))

无运行时依赖