<div dir="ltr">This is assuming that foo and bar are fn(RC<int>), right?   <br>In normal use I would expect them to be fn(int) ot fn(&int), unless they need to retain a reference.  And in the latter case I would make them fn(&mut RC<int>) and clone() internally.<br>
<div class="gmail_extra"><br><br><div class="gmail_quote">On Sat, Jun 21, 2014 at 10:52 AM, Igor Bukanov <span dir="ltr"><<a href="mailto:igor@mir2.org" target="_blank">igor@mir2.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="">On 21 June 2014 11:10, Nick Cameron <<a href="mailto:lists@ncameron.org">lists@ncameron.org</a>> wrote:<br>
> I wonder if we could come up with _some_<br>
> design that would be better than the current one.<br>
<br>
</div>The reason the ugliness is the repeated clone calls:<br>
<br>
    let x = Rc::<int>::new(1);<br>
    ...<br>
    foo(x.clone());<br>
    bar(x.clone());<br>
    last_x_use(x);<br>
<br>
In this pattern the x is repeatedly cloned to pass it as argument that<br>
will be moved. The ugliness can be eliminated if x as the local<br>
variable can be annotated to tell the compiler to clone it before<br>
passing to functions. I.e. something like:<br>
<br>
    let autoclone x = Rc::<int>::new(1);<br>
    ...<br>
    foo(x);<br>
    bar(x);<br>
    last_x_use(x);<br>
<br>
Another possibility is to allow for move-in-move-out params that moves<br>
the the value back to the caller when the function returns forcing the<br>
callee to use the clone call if it wants to store the argument for a<br>
later use.<br>
<div class="HOEnZb"><div class="h5">_______________________________________________<br>
Rust-dev mailing list<br>
<a href="mailto:Rust-dev@mozilla.org">Rust-dev@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/rust-dev" target="_blank">https://mail.mozilla.org/listinfo/rust-dev</a><br>
</div></div></blockquote></div><br></div></div>