#module #fundamental #general-purpose #problem #language #extend #collection

无 std non_std

通用工具集合,用于解决问题。本质上是扩展语言而不破坏,因此可以单独使用或与其他类似模块一起使用。

3 个版本

0.1.4 2022 年 6 月 26 日
0.1.3 2022 年 6 月 12 日
0.1.0 2022 年 5 月 25 日

#2492 in 开发工具

Download history 40/week @ 2024-03-29 12/week @ 2024-04-05 1/week @ 2024-05-03 7/week @ 2024-05-10 20/week @ 2024-05-17 30/week @ 2024-05-24 201/week @ 2024-05-31 35/week @ 2024-06-07 62/week @ 2024-06-14 36/week @ 2024-06-21

337 每月下载次数

MIT 许可证

2MB
54K SLoC

模块 :: non_std

experimental rust-status docs.rs discord

通用工具集合,用于解决问题。本质上是扩展语言而不破坏,因此可以单独使用或与其他类似模块一起使用。

示例 :: 实现

use non_std::prelude::*;

fn main()
{
  println!( "implements!( 13_i32 => Copy ) : {}", implements!( 13_i32 => Copy ) );
  println!( "implements!( Box::new( 13_i32 ) => Copy ) : {}", implements!( Box::new( 13_i32 ) => Copy ) );
}

示例 :: 类型构造函数

在 Rust 中,你通常需要将给定类型包装成一个新的类型。特别是孤儿规则的作用基本上是为了防止你为外部类型实现外部特质。为了克服这种限制,开发者通常将外部类型包装成元组,引入新的类型。类型构造函数正好做到这一点,并为构造的类型自动实现 From、Into、Deref 等特质。

types 负责为 Single、Pair、Homopair、Many 生成代码。每个类型构造函数都有自己的关键字,但 Pair 和 Homopair 使用相同的关键字,差异在于构成类型的不同数量。可以一次性定义所有类型。

use non_std::prelude::*;

types!
{

  single MySingle : f32;
  single SingleWithParametrized : std::sync::Arc< T : Copy >;
  single SingleWithParameter : < T >;

  pair MyPair : f32;
  pair PairWithParametrized : std::sync::Arc< T1 : Copy >, std::sync::Arc< T2 : Copy >;
  pair PairWithParameter : < T1, T2 >;

  pair MyHomoPair : f32;
  pair HomoPairWithParametrized : std::sync::Arc< T : Copy >;
  pair HomoPairWithParameter : < T >;

  many MyMany : f32;
  many ManyWithParametrized : std::sync::Arc< T : Copy >;
  many ManyWithParameter : < T >;

}

示例 :: make - 可变参数构造函数

实现 [Make0]、[Make1] 等直到 MakeN 的特质,以提供使用不同参数集构建你的结构的接口。在这个示例结构中,Struct1 可以不带参数、带单个参数或带两个参数来构建。

  • 不带参数的构造函数将字段填充为零。
  • 带单个参数的构造函数将两个字段都设置为参数的值。
  • 带 2 个参数的构造函数设置每个字段的单独值。
use non_std::prelude::*;

#[ derive( Debug, PartialEq ) ]
struct Struct1
{
  a : i32,
  b : i32,
}

impl Make0 for Struct1
{
  fn make_0() -> Self
  {
    Self { a : 0, b : 0 }
  }
}

impl Make1< i32 > for Struct1
{
  fn make_1( val : i32 ) -> Self
  {
    Self { a : val, b : val }
  }
}

impl Make2< i32, i32 > for Struct1
{
  fn make_2( val1 : i32, val2 : i32 ) -> Self
  {
    Self { a : val1, b : val2 }
  }
}

let got : Struct1 = make!();
let exp = Struct1{ a : 0, b : 0 };
assert_eq!( got, exp );

let got : Struct1 = make!( 13 );
let exp = Struct1{ a : 13, b : 13 };
assert_eq!( got, exp );

let got : Struct1 = make!( 1, 3 );
let exp = Struct1{ a : 1, b : 3 };
assert_eq!( got, exp );

添加到您的项目

cargo add non_std

依赖关系

~2.2–4MB
~88K SLoC