Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 如何在包含将所有值转换为字符串的不同类型的切片值的枚举上实现迭代器?_Rust - Fatal编程技术网

Rust 如何在包含将所有值转换为字符串的不同类型的切片值的枚举上实现迭代器?

Rust 如何在包含将所有值转换为字符串的不同类型的切片值的枚举上实现迭代器?,rust,Rust,这是我的enum的一个简化示例: #[派生(调试、克隆、复制)] 枚举数据>。我需要一种迭代切片值的方法(无论是&[i32]还是&[f64],存储在枚举中的任何内容)将所有值转换为字符串。以下代码显示了原则上我希望实现的目标,但它不起作用: impl{ fn iter_to_string(&self)->impl迭代器{ 匹配自我{ Data::I32(Data)=>Data.iter().map(|&x | x.to_string()), Data::F64(Data)=>Data.iter(

这是我的
enum
的一个简化示例:

#[派生(调试、克隆、复制)]
枚举数据>
。我需要一种迭代切片值的方法(无论是
&[i32]
还是
&[f64]
,存储在
枚举中的任何内容)将所有值转换为
字符串。以下代码显示了原则上我希望实现的目标,但它不起作用:

impl{
fn iter_to_string(&self)->impl迭代器{
匹配自我{
Data::I32(Data)=>Data.iter().map(|&x | x.to_string()),
Data::F64(Data)=>Data.iter().map(|&x | x.to_string()),
}
}
}
错误[E0308]:匹配臂的类型不兼容
-->src/main.rs:9:9
|
9 |/匹配自我{
10 | | Data::I32(Data)=>Data.iter().map(|&x | x.to_string()),
11 | | Data::F64(Data)=>Data.iter().map(|&x | x.to_string()),
||------------------------------------将arm与不兼容的类型匹配
12 | |         }
|| u______;应为i32,找到f64
|
=注意:应为'std::iter::Map'类型[closure@src/main.rs:11:48:11:66]>`
您有两个选择:

  • 动态调度
  • 非惰性迭代器
  • 您不能同时使用静态分派和惰性迭代器,因为这需要编译器在编译时生成
    to_string()
    的代码路径,而正确的选择只能在运行时知道

    动态调度 要使用动态分派,可以在trait对象上创建迭代器

    使用std::fmt::Display;
    结构显示iter+'iter>,
    }
    恳求{
    类型项=字符串;
    fn下一步(&mut self)->选项{
    self.internal_iter.next().map(|val | format!(“{}”,val))
    }
    }
    
    但是,为了在切片迭代器上使用它,您需要将每个引用转换为trait对象引用,例如

    data.iter().map(|x | x as&dyn显示)
    
    非惰性迭代器 只需收集您已经在做的
    映射的结果,并在结果上返回一个拥有的迭代器。这有分配的缺点,但它解决了需要在编译时选择代码路径的问题

    data.iter()
    
    @trentcl您认为,一旦重新打开,这将是?@Shepmaster的副本吗?是的,可能是因为区别在于我需要将所有不同的类型转换为公共类型(在本例中,转换为
    字符串
    ),我想每次需要使用
    enum
    在同一
    Vec
    中存储不同的
    Vec
    类型时,这是一种常见的情况。如果它被重新打开,我可以发布一个答案,否则如果你认为它是重复的,请继续删除它。