You’re trying to move the ~strs out of the vector. You’ll need to use `move_iter`:
~~~ let ports = do myvect.move_iter().map |s| { let (pport, cchan) = stream(); do spawn { cchan.send(fun(s)) } pport }.to_owned_vec(); ~~~ Also note the use of `to_owned_vec`. `map` lazily returns a `Map` iterator - you need to explicitly drain it. (Note I haven’t tried compiling this) ~Brendan On 3 Nov 2013, at 7:04 am, Leah Hanson <astriea...@gmail.com> wrote: > Thanks, Scott, I think that's closer. > > However, now I'm having trouble with my pointer types. Using the element > inside a spawn means that I need to capture the owned string in the right way > so that the compiler allows me to give it to the other task. > > This version: > ~~~ > let ports = do myvect.iter().map |s| { > let (pport, cchan) = stream(); > do spawn { > cchan.send(fun(*s)) > } > pport > }; > ~~~ > gives me pointer-type related errors: > • error: cannot move out of dereference of & pointer > • cchan.send(fun(*s)) > • error: cannot borrow immutable local variable as mutable > • when I iterate over the Ports later > • error: cannot capture variable of type `&~str`, which does not > fulfill `Send`, in a bounded closure > • cchan.send(fun(*s)) > I also tried a version with |&s| and cchan.send(fun(s)), which gave me > different errors: > • error: cannot move out of captured outer variable in a heap closure > • cchan.send(fun(*s)) > • error: cannot move out of dereference of & pointer > • on the |&s| > • error: cannot borrow immutable local variable as mutable > • when I iterate over the Ports later > > I'm very new to Rust. What do I need to do to let the compiler know that I'm > not going to use anything in the first vec anymore? That I just want the ~str > pointers directly? > > (I put the |s| outside the {} because putting it inside seemed to confuse > things -- in that case, rustc expected an identifier instead of the `let` > that comes next, so I assumed that `do v.iter().map {|s| ...}` is a syntax > error.) > > Thanks, > Leah > > > > > On Sat, Nov 2, 2013 at 3:23 PM, Scott Lawrence <byt...@gmail.com> wrote: > I would think: > > let ports = do myvect.iter().map { |e| something(e) } > > > On Sat, 2 Nov 2013, Leah Hanson wrote: > > Hi, > > I have a ~[~str]. I have code that will turn a ~str into a Port<uint>. > > I want to end up with a [Port<uint>]. (or ~ or @ or whatever. I just want > to be able to iterate over the Ports later.) > > Since I'm not sure what looping construct to use, I tried with a for-each > loop. > > ~~~ > let ports = for s in myvect.iter() { > let (pport, cchan) = stream(); > do spawn { > cchan.send(fun(*s)) > } > pport > }; > ~~~ > > As you might, expect I got an error: > error: mismatched types: expected `()` but found `std::comm::Port<uint>` > (expected () but found struct std::comm::Port) > > From this, I take it that for loops must return `()`, rather than an actual > value. When I searched for a map function in the documentation, I only > found a Map type. > > How would you map one vector to a vector of a different element type? > > Thanks, > Leah > > > -- > Scott Lawrence > > _______________________________________________ > Rust-dev mailing list > Rust-dev@mozilla.org > https://mail.mozilla.org/listinfo/rust-dev _______________________________________________ Rust-dev mailing list Rust-dev@mozilla.org https://mail.mozilla.org/listinfo/rust-dev