Rust中{:?}格式化输出Range为何未展开所有值?
问题解答
首先要明确:Rust中的Range(比如1..5)并不是数组,它是一个惰性迭代器结构体,本身只存储起始值和结束值,不会预先生成所有包含的元素。
{:?}调用的是类型的Debug trait实现,Range的Debug实现就是打印它的区间表示(start..end),而不是展开所有元素——这和数组不同,数组是已经存储了所有元素的集合,所以Debug会输出全部元素。
如果想要用{:?}输出Range的所有元素,需要先把它转换成一个实际存储元素的集合(比如Vec),再打印:
fn main() { let myvar = 1..5; // 转换成Vec后打印,输出 [1, 2, 3, 4] println!("{:?}", myvar.collect::<Vec<_>>()); }
如果想要输出1234这种无分隔的格式,可以通过迭代器拼接字符串:
fn main() { let myvar = 1..5; let joined = myvar.map(|x| x.to_string()).collect::<Vec<_>>().join(""); println!("{}", joined); // 输出 1234 }
另外要注意:迭代器只能被消费一次,所以如果先在for循环里用了myvar,之后就不能再调用collect了,反之亦然。
内容的提问来源于stack exchange,提问作者Anon Anon
相关产品推荐
相关产品推荐

