+1 on specifying function. That potentially lowers the requirements on
the Traits -- e.g. don't have to force clone-ability as long as you
can create+move it; perhaps even create it in place.

I have been waiting on integer parameters on traits since I first ran
into Rust, but the rust team might be avoiding that to prevent getting
Turing complete generics/templates.

Ashish


On Sat, Nov 30, 2013 at 12:39 AM, Kevin Ballard <[email protected]> wrote:
> Personally, I think it would be nicer to just have a syntax that says "create 
> an array of length N by executing the following expression (typically a 
> function call) N times".
>
> Something along the lines of
>
>     let ary = [Foo::new().., ..32];
>
> This would be more generic, because it will work with non-Clonable values, 
> and if you wanted cloned values you'd just say
>
>     let ary = [foo.clone().., ..32];
>
> Although if we ever get the ability to make generics that have integral 
> parameters (which is necessary to implement traits on arbitrary arrays) then 
> we could do this in the libraries by writing a function like I had before. 
> Something like the following:
>
> libstd/array.rs:
>
> #[inline]
> fn from_fn<T, N as uint> init(f: |uint| -> T) -> [T, ..N] {
>     let mut ary: [T, ..N];
>     unsafe {
>         ary = intrinsics::uninit();
>         for i in range(0u, N) {
>             intrinsics::move_val_init(&mut ary[i], f(i));
>         }
>     }
>     ary
> }
>
>
> This would let you call it like Foo(array::from_fn(|_| Zero::zero())).
>
> -Kevin
>
> On Nov 29, 2013, at 8:37 PM, Ashish Myles <[email protected]> wrote:
>
>> That's some seriously nifty stuff, which got my stuff compiling again. :)
>>
>> But for the long term, it would be nice to have a syntax that behaves
>> as was the case with the Copy trait -- it takes a single value and
>> clones it into the elements of the static array.  Or perhaps the
>> developers disagree and consider it to be a niche use (static arrays
>> with sizes known a-priori when writing the code) -- it would be good
>> to get some clarity on this.
>>
>> Thanks,
>> Ashish
>>
>>
>> On Fri, Nov 29, 2013 at 10:20 PM, Kevin Ballard <[email protected]> wrote:
>>> 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
>>>
>>>
>
_______________________________________________
Rust-dev mailing list
[email protected]
https://mail.mozilla.org/listinfo/rust-dev

Reply via email to