Как мне получить автоматическое преобразование из ржавчины в черту?

#rust

Вопрос:

У меня есть структура Object , для которой у меня есть много реализаций From (включая isize и amp;str ). Из этой статьи, где Into она описана как «гениальная», я понял, что для меня все может быть автоматически преобразовано. Я включил предложения, которые сделали люди, и сделал что-то автономное на игровой площадке, но все равно появляется пара ошибок.

 #[derive(Copy,Clone)]
pub union Object {
    d:f64,
    i:isize,
}
impl From<isize> for Object {
    fn from(i:isize) -> Self {
        Object{i}
    }
}
impl From<f64> for Object {
    fn from(d:f64) -> Self {
        Object{d}
    }
}
pub fn old_convert(foo: Object, _elements: amp;[Object]) -> Object {
    foo
}
pub fn new_convert<'a,T>(foo: impl Into<Object>, elements: amp;'a [T]) -> Object
where
    amp;'a T: Into<Object>,
    Object: From<T>,
{
    let mut el = Vec::new();
    for o in elements.iter() {
        el.push(o.into())
    }
    old_convert(foo.into(),amp;el)
}

#[test]
fn testOldConvert() {
    old_convert(Object::from(42), amp;[Object::from(3.1415)]);
}
#[test]
fn testNewConvert() {
    new_convert(42, amp;[3.1415]);
}
 

Чтобы вы могли видеть, чем я сейчас занимаюсь. Я бы не хотел включать все Object::from(...) , когда я использую свою функцию.
Есть 1 ошибка и 1 проблема:

  1. Я не знаю, как реализовать From то, о чем он просит
  2. Я не хочу создавать временный вектор… конечно, есть какая-то абстракция с нулевой стоимостью, которая позволяет мне передавать преобразованный массив

Комментарии:

1. вероятно, также потребуется собрать в a Vec , если его предполагается передать в виде среза

2. Я понимаю, что для вас это очевидно, но для нас все еще трудно сказать, что new_convert() предполагается делать. old_convert() возвращал пару объектов и фрагмент объектов, используя тот факт, что он получил фрагмент объектов. new_convert() возвращает пару… объект и последний элемент среза? Это и есть предполагаемое поведение? Другая проблема заключается в том , что срез содержит ссылки на T , и вы From предоставляете преобразования из принадлежащих значений.

3. Чтобы создать что-то , что работает так, как old_convert() я бы использовал подпись, которая принимает и возвращает a Vec , как в этой модификации . ( impl Into<...> в основном это анонимный универсальный.) Вы можете сделать его еще немного более общим, как показано здесь , и принять любые итерации, включая векторы, а также массивы и т. Д. Надеюсь, что некоторые из них помогут вам в том, чего вы пытаетесь достичь.

4. Спасибо @user4815162342 Я ценю вашу помощь. Извините, что мой пример был не очень понятен, и я повторял пример кода, чтобы попытаться получить ответ на мой «реальный» вопрос, не добавляя нелепого количества деталей… но по мере того, как я использовал ваши предложения, я стал ближе. Мне не нужно на самом деле возвращать коллекцию… так что пример, который у меня сейчас есть, ближе… Мне нужно пройтись по нему еще раз. Я действительно ценю вашу помощь, но если бы вы могли ответить как «ответ», а не как комментарий, я мог бы поблагодарить вас за помощь. old_convert полезен только с точки зрения типов и того, как он называется

5. Если вам нужно только перебирать объекты, то old_convert() на самом деле вам нужен не срез, а итератор над Object s. Если вы сможете изменить old_convert() , возможно, что- то подобное сработает? Если нет, то есть, если old_convert() настаивает на получении фрагмента Object s, то, боюсь, вам придется использовать временное распределение, потому new_convert() что он просто не получает такой фрагмент, поэтому его придется создать.