gpt4 book ai didi

rust - 处理宏中与类型相关的警告的最佳策略是什么?

转载 作者:行者123 更新时间:2023-11-29 08:04:15 25 4
gpt4 key购买 nike

我已经定义了一个宏来优雅地处理越界切片。以下是宏的定义:

macro_rules! slice_or_else {
($array: expr, $to:expr, $err: block) => ({
if $to <= $array.len() {
&$array[..$to]
}
else $err
})
}

当我使用它编译一个函数时,编译器会提示

warning: comparison is useless due to type limits, #[warn(unused_comparisons)] on by default

尽管使用比较来确定请求的切片是否有效,并且宏通过测试。我错过了什么吗?可以为宏关闭这些警告吗?


更新:正如 Reem 所建议的那样,将 0 作为 $to 传递似乎会导致问题。一个例子(Playpen Example):

fn main() {
let a: [u8; 4] = [0, 1, 2, 3];
assert!(slice_or_else!(a, 0, {return;}).len() == 0);
}

我使用宏是因为我希望能够影响调用函数的流程。

既然警告是有道理的,那么处理这个用例的最佳策略是什么?将 $to 绑定(bind)到临时变量?明确地转换它?

最佳答案

如果您将此宏与 $to 一起使用设置为 0然后 rustc 会提示 0 <= X永远是真的,因为我们正在使用 usize ,这是无符号的。注意 &x[..0]永远不会触发越界错误。

在相关说明中,这是编写此代码的更惯用的方法:

fn slice_opt<T>(buf: &[T], ind: usize) -> Option<&[T]> {
if ind <= buf.len() {
Some(&buf[..ind])
} else {
None
}
}

// Usage site // $err
slice_opt(x).unwrap_or_else(|| { &[] })

除非您必须使用宏,否则不应使用宏。

需要使用宏的情况:

  • 新语法
  • 从封闭范围返回/中断/继续
  • 检查代码生成
  • 一些微妙的类型技巧(仅借用一种类型的一个字段,等等)

不需要使用宏的事情:

  • 任何可以是函数的东西(使用函数)
  • 内联(使用#[inline])
  • 多态性/泛型(使用实际的泛型)

关于rust - 处理宏中与类型相关的警告的最佳策略是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28956434/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com