当前位置:  开发笔记 > 编程语言 > 正文

当匹配字符串文字时,"类型str没有实现大小"吗?

如何解决《当匹配字符串文字时,"类型str没有实现大小"吗?》经验,为你挑选了1个好方法。



1> Shepmaster..:

我假设您已经阅读了有关错误的其他问题,因此我将仅介绍此具体案例.

你想用&arg[..]而不是&arg:

fn without_xxx(args: Args) -> Vec {
    let mut out = vec![];
    let mut xxx = false;

    for arg in args {
        match &arg[..] {
             "-" => xxx = true,
            _ => out.push(arg)
        }
    }

    out
}

我承认错误很奇怪.这就是我的想法:

当你这样做时&arg,你正在参考a String.String实施Deref,这意味着他们可以参与deref胁迫.

匹配臂是类型&str.比较这两种类型时,编译器会看到你有一个&String并且正在尝试将它与a匹配&str.它会自动取消引用这两个值并应用deref强制.但是,a str不能是独立类型,因此您会收到错误.

使用&arg[..]触发Index特性代替.这会产生一个&str,因此匹配臂不会进行任何自动解除引用或强制.

另外:

    不需要显式类型 output

    在函数/闭包的末尾使用隐式返回.

    没有必要打电话,to_string因为arg已经是String.


为了好玩,这是一个使用一个版本filter_map,collect和只是一个普通的if:

fn without_xxx(args: Args) -> Vec {
    let mut xxx = false;

    let out = args.filter_map(|a| {
        if a == "-" {
            xxx = true;
            None
        } else {
            Some(a)
        }
    }).collect();

    // I assume you do something with `xxx` here

    out
}

可能具有性能优势,因为它可能潜在地为向量的大小分配上限.

另一个版本:

fn without_xxx(args: Args) -> Vec {
    let mut xxx = false;

    let out = args.filter(|a| {
        let matched = a == "-";
        xxx = xxx || matched;
        !matched
    }).collect();

    // I assume you do something with `xxx` here

    out
}


我可能会弄错,但现在不宜在`&x [..]`上使用`&*x`?
推荐阅读
mobiledu2402851377
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有