Swift has the same convention: sort would sort in place and sorted would return a sorted clone of the item. The convention is quite useful, though it's late enough in the life of Rust's standard library that I'm not sure it could be adopted widely the way it is in Swift.
I'd say that it sounds like it returns a sorted version of the vector. In other languages, this means that the original vector has to be cloned to avoid side effects. This has the disadvantage that functional style often has worse performance.
But in Rust we have the possibility to do this without cloning it (by moving) so that we can have functional style without the performance overhead.
If you do want to clone it (because you still need the original vector), you can still do .clone().sorted(). And the best thing is: If you forget the .clone(), the compiler will throw an error ("use of moved value", I think).
The other thing I notice about the itertools approach is the transformation to vec is a little magical. Embedding a .sorted() in an iterator chain with itertools is nice, the proposed change looks like
I assume this would imply also adding Vec::sorted_by and Vec::sorted_by_key?
It being on Vec is a nice way to avoid the "does it collect, does it return a Vec or an iterator, is it lazy" etc questions that happen with any iterator version.
However, if you're sorting in Vec, you don't add very much by chaining .sorted(), since you can avoid it altogether by doing something like .collect<BTreeSet<_>>() instead. It's only useful if you intend to actually end on a Vec.