I was under the impression that the compiler already optimizes out a lot of clones where the clone is primarily used to satisfy the borrow checker. Is that not the case?
post
replies:
Really not a fan of this approach. Makes the order of operations extremely weird. I would much prefer having super blocks that are explicitly inserted in the above scope. I.e. this:
tokio::task::spawn(async move {
do_something_else_with(
super { self.some_a.clone() },
super { self.some_a.clone() },
super { self.some_a.clone() },
)
});
Would desugar to:
tokio::task::spawn({
let first_block = { self.some_a.clone() };
let second_block = { self.some_a.clone() };
let third_block = { self.some_a.clone() };
async move {
do_something_else_with(
first_block,
second_block,
third_block,
)
}
});
Only problem is if the clone is inside another block... but perhaps you could do super super { ... }? But that sort of gets crazy and makes it very hard to read again.
replies:
permalink
fedilink
source
parent
hideshow 1 child comment
I like this solution more too, what about something like?
code examples
{
spawn(async move {
do_something_else_with(
^{ self.some_a.clone() },
^{ self.some_a.clone() },
^{ self.some_a.clone() },
)
});
}
Which desugars to
{
let (a, b, c) = (self.some_a.clone(), self.some_a.clone(), self.some_a.clone());
spawn(async move {
do_something_else_with(a, b, c)
});
}
Then have like
'super1: {
'super2: {
spawn(async move {
do_something_else_with(
^super1: { self.some_a.clone() },
^super1: { self.some_a.clone() },
^super1: { self.some_a.clone() },
)
});
}
}
Which desugars to
'super1: {
let (a, b, c) = (self.some_a.clone(), self.some_a.clone(), self.some_a.clone());
'super2: {
spawn(async move {
do_something_else_with(a, b, c)
});
}
}
And finally, the harder to read
'super1: {
'super2: {
spawn(async move {
do_something_else_with(
^^{ self.some_a.clone() },
^^{ self.some_a.clone() },
^^{ self.some_a.clone() },
)
});
}
}
Which desugars to
'super1: {
let (a, b, c) = (self.some_a.clone(), self.some_a.clone(), self.some_a.clone());
'super2: {
spawn(async move {
do_something_else_with(a, b, c)
});
}
}
all 5 comments