#kotlin #macro #sugar #control-flow

macro build kotlike

一个 Rust 宏,用于修改问号操作符的行为,就像 Kotlin 一样

1 个不稳定版本

0.1.0 2024 年 1 月 7 日

#430构建工具

Apache-2.0

6KB

Kotlike

一个 Rust 宏,用于修改问号操作符的行为,就像 Kotlin 一样

有了它,你可以轻松提取包裹在无数字 Option<T>Result<T,Err> 中的值。

此外,它不会破坏你的控制流程。即使你得到一个 NoneErr(所有意外的值都将转换为 None),你仍可以继续工作

这意味着

fn do_something() {
    let value: Option<TypeYourWant> = wrapped_value?.something_return_option()?.something_return_result()?.value;
}

会正常工作!就像 Kotlin 风格一样。你不必担心它将抛出什么 Err

工作原理

用法

#[kotlike]
fn main() {
    let a = "Hello".to_string();
    
    let c = File::create("test.txt")?.write_all(a.as_bytes())?.clone();
    
    let mut b: String = String::new();
    
    let len = File::open("test.txt")?.read_to_string(&mut b)?.clone();
    
    println!("Hello, {:?}({:?})!", b,len);
}

扩展宏的样式如下:

fn main() {
  let a = "Hello".to_string();
    
  let c: Option<()> = File::create("test.txt")
      .map_or(None, |mut v| {
          v.write_all(a.as_bytes())
              .map_or(None, |mut v| Some(v.clone()))
      });
    
  let mut b: String = String::new();
    
  let len: Option<usize> = File::open("test.txt")
      .map_or(None, |mut v|{
          v.read_to_string(&mut b)
              .map_or(None, |mut v| Some(v.clone()))
      });
    println!("Hello, {:?}({:?})!", b,len);
}

上述示例仅显示其工作原理。不要过分关注这些愚蠢的代码。

许可证

Apache 许可证 2.0

依赖关系

~2.4–4MB
~71K SLoC