【问题标题】:Matching on a enum String匹配枚举字符串
【发布时间】:2021-12-23 21:15:05
【问题描述】:

我正在学习 Rust,我正在尝试编写一个简单的 IP 处理函数

enum IpAddr{
   v4(u8,u8,u8,u8),
   v6(String),
}

impl IpAddr{
    fn write(&self){
        match *self {
            IpAddr::v4(A,B,C,D) => println!("{}.{}.{}.{}",A,B,C,D),
            IpAddr::v6(S) => println!("{}",S) 
        }
    }
}

v4 匹配良好,但我在第二个版本中出现以下构建错误

错误[E0507]:无法移出共享引用后面的self.0

发生移动是因为_S 的类型为String,它没有实现Copy 特征

如何匹配带有字符串的枚举?

【问题讨论】:

标签: rust enums


【解决方案1】:

它的抱怨是因为您试图通过取消引用来复制 self,但 IpAddr 包含一个不可复制的 String

删除取消引用,它应该可以按预期工作

match self {
    IpAddr::v4(A,B,C,D) => println!("{}.{}.{}.{}",A,B,C,D),
    IpAddr::v6(S) => println!("{}",S) 
}

【讨论】:

    【解决方案2】:

    我不确定您为什么要匹配 *self,因为它是 does not appear to be necessary,但如果您出于某种原因确实需要这样做,您也可以通过将 ref keyword 与您的变量(ref s),这将导致值被借用而不是移动它。

    enum IpAddr{
       V4(u8,u8,u8,u8),
       V6(String),
    }
    
    impl IpAddr{
        fn write(&self){
            match *self {
                IpAddr::V4(a,b,c,d) => println!("{}.{}.{}.{}",a,b,c,d),
                IpAddr::V6(ref s) => println!("{}", s) 
            }
        }
    }
    

    Playground

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-17
      • 1970-01-01
      • 1970-01-01
      • 2023-02-08
      相关资源
      最近更新 更多