【发布时间】:2017-01-03 22:43:20
【问题描述】:
我正在编写一堆断言,它们都涉及从列表中弹出一个值。
来自 Scala 背景,我自然而然地这样做了:
let mut list = List::new();
let assert_pop = |expected| assert_eq!(list.pop(), expected);
这样我就可以只写assert_pop(None) 或assert_pop(Some(3)) 而不必每次都写assert_eq!(list.pop(), None) 或assert_eq!(list.pop(), Some(3))。
当然,借用检查器不喜欢这一点,因为闭包本质上需要在未公开的时间内借用该值,而我的其余代码四处变异,因此违反了 规则如果您正在变异,则没有别名”。
问题是:有没有办法解决这个问题?我必须编写一个宏,还是有一种时髦的内存安全方法可以解决这个问题?
注意,我知道我可以像这样定义闭包:
let_assert_pop = |lst: &mut List, expected| assert_eq!(lst.pop(), expected);
但这会少DRY,因为我必须在每次调用时将&mut list 作为第一个参数传递。
【问题讨论】: