Printing a slice

I'm wondering about the difference in println! treatment of arrays and slices.

I can do this:

let u = [2, 4, 8];
println!("{:?}", u);
println!("{:?}", &u);
println!("{:?}", &u[0..]);

But not this:

println!("{:?}", u[0..]);

So I have a few questions:

  • Why are arrays and slices treated syntactically differently by println! macro?
  • Where is this difference documented?
  • Where can I find the official slice syntax documentation (i.e. for u[a..b] etc.)?
1 Like

+1 on this. I also wondered and wanted to ask exactly this several times, but somehow was too lazy to submit.
Great thing you weren't :wink:

Commenting here to get on /cc list.

let u = [2, 4, 8];

This is a fixed-size array, [i32; 3].
&u is a reference to it of type &[i32; 3].

u[..] is [i32], which is an unsized array. One can do very little with unsized values directly so you take a slice instead: &u[..] of type &[i32].

but then again, the println! macro takes a reference to everything you pass to it, so technically that should work automatically, shouldn't it?

3 Likes

Before the reference is taken you need to store the value on the stack and that requires knowing its size statically.