gpt4 book ai didi

macros - 如何消除宏中的虚假警告 "value assigned is never read"?

转载 作者:行者123 更新时间:2023-11-29 08:02:36 26 4
gpt4 key购买 nike

我是 Rust 的新手,正在学习编写自己的宏。这个宏应该填充我的结构 MatrixXf像宏vec!Vec<T> 做.

//fills matrix with matlab like syntax
macro_rules! mat {
[ $($( $x: expr ),*);* ] => {{
let mut tmp_vec = Vec::new();
let mut rows = 0;
let mut cols = 0;
let mut is_first_row_collected = false;
$(
let mut inner_cols = 0;
$(
tmp_vec.push($x);
inner_cols += 1;
)*
if is_first_row_collected {//if we read first row we can check that other rows have same length
assert!(inner_cols == cols);
} else {
is_first_row_collected = true;
cols = inner_cols;
}
rows += 1;
)*
MatrixXf::construct(tmp_vec, rows, cols)//fills MatrixXf fields
}}
}

我这样使用它:

let mat = mat![1.0, 2.0, 3.0; 4.0, 5.0, 6.0];

一切正常,但编译器显示以下警告:

7:23 warning: value assigned to is_first_row_collected is never read, #[warn(unused_assignments)] on by default :7 is_first_row_collected = true ; cols = inner_cols ; } rows += 1 ; ) *

也许我误解了什么,但我确实使用了 is_first_row_collected检查是否访问了第一行时。是否可以重写我的代码以避免出现此警告?

最佳答案

您可以将 cols 包装在 Option 中,而不是使用 bool 变量,以明确 cols 没有有效值,直到您阅读第一行。

//fills matrix with matlab like syntax
macro_rules! mat {
[ $($( $x: expr ),*);* ] => {{
let mut tmp_vec = Vec::new();
let mut rows = 0;
let mut cols = None;
$(
let mut inner_cols = 0;
$(
tmp_vec.push($x);
inner_cols += 1;
)*
if let Some(cols) = cols {//if we read first row we can check that other rows have same length
assert!(inner_cols == cols);
} else {
cols = Some(inner_cols);
}
rows += 1;
)*
MatrixXf::construct(tmp_vec, rows, cols.unwrap_or(0))//fills MatrixXf fields
}}
}

另一种选择是通过在宏的模式中分隔第一行和后续行来不同地处理它们。这样,我们就可以完全避免该标志,因为当我们处理以下行时,我们已经知道列数。

//fills matrix with matlab like syntax
macro_rules! mat {
[] => { MatrixXf::construct(Vec::new(), 0, 0) };
[ $( $x: expr ),* $(; $( $y: expr ),*)* ] => {{
let mut tmp_vec = Vec::new();
let mut rows = 0;
let mut inner_cols = 0;
$(
tmp_vec.push($x);
inner_cols += 1;
)*
let cols = inner_cols; // remember how many columns the first row has
rows += 1;
$(
inner_cols = 0;
$(
tmp_vec.push($y);
inner_cols += 1;
)*
assert!(inner_cols == cols); // check that the following rows have as many columns as the first row
rows += 1;
)*
MatrixXf::construct(tmp_vec, rows, cols)//fills MatrixXf fields
}}
}

在这个版本的宏中,我添加了另一个规则来在没有参数时构造一个空矩阵,并且我移动了分号的位置,这样当您只有一行时就不需要尾随分号。

关于macros - 如何消除宏中的虚假警告 "value assigned is never read"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32873514/

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