3个稳定版本

1.0.2 2024年2月22日
1.0.1 2024年2月19日

416过程宏 中排名

Download history 18/week @ 2024-04-04

每月78次下载

MIT 协议

16KB
359

guard_macros

此库提供了一个名为 guard! 的宏,用于替换重复的 let-elseif 语句。

有关文档,请参阅Rustdoc


lib.rs:

使用方法

// returns when (expr) is evaluated to false
guard!( (expr) );

// returns when refuted (i.e. (expr) doesn't match (pat))
guard!( (pat) = (expr) );

// panics instead of returning (called "Refute Handler")
guard!( (expr) => panic!("false") );
guard!( (pat) = (expr) => panic!("refuted") );

guard! {
    // can be repeated
    (expr),
    (pat) = (expr) => panic!("refuted"),

    // can be scoped and nested
    {
        (expr),
        (pat) = (expr),
        {
            (expr),
            (pat) = (expr) => panic!("baz"),
        } => _, // inherit refute handler
    } => panic!("foo"),
}

概述

guard_macros 提供了两个宏

Refute Handler

"Refute Handler" 是当子句条件不满足时执行的语句。可以通过添加 => 后跟一个表达式来指定,可以是

  • 单个子句
    guard! {
        (pat) = (expr) => panic!("refuted"),
        (expr) => panic!("false"),
    }
    
  • 也可以是使用 { } 括起来的子句组。
    guard! {
        {
            (pat) = (expr),
            (expr),
        } => panic!("unmet")
    }
    

    注意:默认情况下,块会创建一个新的作用域,但可以通过在开括号前添加 * 来禁用。

示例

规范

  • guard!

    语法

    GuardBody :
       GuardDecl ( , GuardDecl )* ,?

    GuardDecl :
          *? { GuardBody } RefuteHandlerInheritable
       | GuardClause RefuteHandler?

    GuardClause :
          PatternNoTopAlt = Expression
       | Expression

    RefuteHandler :
       => Expression

    RefuteHandlerInheritable :
          RefuteHandler
       | => _

  • make_guard!

    语法

    MakeGuardBody :
       MakeGuardDecl ( , MakeGuardDecl )* ,?

    MakeGuardDecl :
       Identifier RefuteHandler

Dependencies

~250–690KB
~16K SLoC