Как вы, кажется, понимаете, проблема в том, что key_func
может иметь только один конкретный тип, но каждое из этих двух замыканий имеет разные типы.
Один - это тип, который реализует FnMut(&Person) -> &u32
идругой - это тип, который реализует FnMut(&Person) -> &String
.
Даже если они оба возвращают один и тот же тип, , даже если они полностью синтаксически идентичны, они будут двумя разными типами.Это все равно что пытаться сделать let num: i32 = if predicate { 0 } else { "thing" }
.Вы можете поместить их в объекты черты с той же чертой, но бокс FnMut
s сложно, потому что Box<FnMut...>
не реализует FnMut
.
Есть еще более фундаментальная проблема: вы можетене используйте sort_by_key
с функциями, которые возвращают ссылки .
Одна вещь, которую вы можете сделать, это использовать более общую sort_by
, которая равна FnMut(&T, &T) -> Ordering
и имеет логику вчтобы узнать, что Ordering
вернуть, основываясь на том, какие поля, возможно, руководствуясь каким-либо перечислением SortBy
, если вы действительно хотите.
Другой вариант - просто вызвать sort_by_key
внутри самих ветвей,так что Vec
сортируется исходя из него, или если вы хотите отложить сортировку, затем снова сохраните какой-то индикатор, например, перечисление SortBy
, которое вы затем используете для конкретного выполнения сортировки, когда вам действительно нужносделай это.