If you're willing to use unsafe code and std::unstable, you can do it.

use std::num::Zero;
use std::unstable::intrinsics;

enum Constants {
    SZ = 2
}

struct Foo<T>([T, ..SZ]);

impl<T: Clone + DeepClone + Zero> Foo<T> {
    pub fn new() -> Foo<T> {
        let mut ary: [T, ..SZ];
        unsafe {
            ary = intrinsics::uninit();
            for i in range(0u, SZ as uint) {
                intrinsics::move_val_init(&mut ary[i], Zero::zero());
            }
        }
        Foo(ary)
    }
}

-Kevin

On Nov 29, 2013, at 7:05 PM, Ashish Myles <[email protected]> wrote:

> Is there a plan to support fix-sized vector initialization without manual 
> replication?  My example is just a simplified version -- this was part of a 
> macro that takes the size as input ($n:expr) and the initialization was 
> [Zero::zero(), .. $n].  Is this use case no longer intended to be supported?
> 
> On Nov 29, 2013 6:47 PM, "Huon Wilson" <[email protected]> wrote:
> On 30/11/13 10:33, Ashish Myles wrote:
> Previously we had the Copy trait, which when implemented by trait T
> allowed one to write
> [Zero::zero(), ..SZ] where T implemented the Zero trait.  But now I am
> not sure how to get that behavior.  Concretely, here is the code I
> want to get compiling. (Just to check, I added both Clone and
> DeepClone, even though they don't automatically allow implicit
> copyability).
> 
> ----
> use std::num::Zero;
> 
> enum Constants {
>      SZ = 2
> }
> 
> struct Foo<T>([T, ..SZ]);
> 
> impl<T : Clone + DeepClone + Zero> Foo<T> {
>      pub fn new() -> Foo<T> {
>          Foo([Zero::zero(), ..SZ])
>      }
> }
> ----
> 
> The error I get is:
> 
> error: copying a value of non-copyable type `T`
> tmp.rs:155         Foo([Zero::zero(), ..SZ])
> 
> 
> Any way to do this? Or is this no longer supported for general types?
> Any intentions to add this behavior again?  Otherwise, I can't even
> initialize my struct while being agnostic to the specific value of SZ.
> 
> Ashish
> _______________________________________________
> Rust-dev mailing list
> [email protected]
> https://mail.mozilla.org/listinfo/rust-dev
> 
> Initialising a fixed size vector [T, ..n] by [foo(), .. n] unfortunately 
> requires that `T` is implicitly copyable (that is, it doesn't move ownership 
> when passed by value), and there's no way around this other than [foo(), 
> foo(), foo(),...].
> 
> 
> Huon
> _______________________________________________
> Rust-dev mailing list
> [email protected]
> https://mail.mozilla.org/listinfo/rust-dev
> _______________________________________________
> Rust-dev mailing list
> [email protected]
> https://mail.mozilla.org/listinfo/rust-dev

Attachment: smime.p7s
Description: S/MIME cryptographic signature

_______________________________________________
Rust-dev mailing list
[email protected]
https://mail.mozilla.org/listinfo/rust-dev

Reply via email to