【问题标题】:Is it possible to clone `skip_while`?是否可以克隆`skip_while`?
【发布时间】:2016-07-22 13:10:54
【问题描述】:

std::iter::SkipWhile 有一个 Clone 实现,但是当我尝试调用 clone() 时,我得到:

let a = [-1i32, 0, 1];
let mut iter = a.into_iter().skip_while(|x| x.is_negative()).clone();

方法clone 存在,但不满足以下特征界限:[closure@<anon>:3:45: 3:64] : core::clone::Clone

Playground

【问题讨论】:

    标签: rust


    【解决方案1】:

    问题是闭包没有实现Clone。这是 Rust 中的一个已知问题:#23501

    如果我们使用普通函数而不是闭包会怎样?毕竟,你的闭包不会捕获任何东西。

    fn main() {
        fn is_negative(x: &&i32) -> bool {
            x.is_negative()
        }
    
        let a = [-1i32, 0, 1];
    
        let mut iter = a.into_iter().skip_while(is_negative).clone();
    
        assert_eq!(iter.next(), Some(&0));
        assert_eq!(iter.next(), Some(&1));
        assert_eq!(iter.next(), None);
    }
    

    不幸的是,这不起作用,因为函数也没有实现Clone(尽管它们实现了Copy!)。这也是一个已知问题:#24000#28229

    【讨论】:

    • 其实它们是不同的问题。 fn 指针可以很简单地克隆,它只是没有实现。闭包更难,因为它是否可以被克隆取决于它捕获的值是否可以被克隆,以及如何它们被捕获会影响到这一点。另外,这开始进入“你如何指定闭包应该实现哪些特征”,这一切都变得非常混乱。
    • 对。我刚刚搜索并发现了一个单独的闭包问题,因此我相应地编辑了我的答案。
    • 感谢您的解释!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 2019-01-07
    • 2011-05-29
    • 2017-02-13
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    相关资源
    最近更新 更多