#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 проблема:
- Я не знаю, как реализовать
From
то, о чем он просит - Я не хочу создавать временный вектор… конечно, есть какая-то абстракция с нулевой стоимостью, которая позволяет мне передавать преобразованный массив
Комментарии:
1. вероятно, также потребуется собрать в a
Vec
, если его предполагается передать в виде среза2. Я понимаю, что для вас это очевидно, но для нас все еще трудно сказать, что
new_convert()
предполагается делать.old_convert()
возвращал пару объектов и фрагмент объектов, используя тот факт, что он получил фрагмент объектов.new_convert()
возвращает пару… объект и последний элемент среза? Это и есть предполагаемое поведение? Другая проблема заключается в том , что срез содержит ссылки наT
, и выFrom
предоставляете преобразования из принадлежащих значений.3. Чтобы создать что-то , что работает так, как
old_convert()
я бы использовал подпись, которая принимает и возвращает aVec
, как в этой модификации . (impl Into<...>
в основном это анонимный универсальный.) Вы можете сделать его еще немного более общим, как показано здесь , и принять любые итерации, включая векторы, а также массивы и т. Д. Надеюсь, что некоторые из них помогут вам в том, чего вы пытаетесь достичь.4. Спасибо @user4815162342 Я ценю вашу помощь. Извините, что мой пример был не очень понятен, и я повторял пример кода, чтобы попытаться получить ответ на мой «реальный» вопрос, не добавляя нелепого количества деталей… но по мере того, как я использовал ваши предложения, я стал ближе. Мне не нужно на самом деле возвращать коллекцию… так что пример, который у меня сейчас есть, ближе… Мне нужно пройтись по нему еще раз. Я действительно ценю вашу помощь, но если бы вы могли ответить как «ответ», а не как комментарий, я мог бы поблагодарить вас за помощь.
old_convert
полезен только с точки зрения типов и того, как он называется5. Если вам нужно только перебирать объекты, то
old_convert()
на самом деле вам нужен не срез, а итератор надObject
s. Если вы сможете изменитьold_convert()
, возможно, что- то подобное сработает? Если нет, то есть, еслиold_convert()
настаивает на получении фрагментаObject
s, то, боюсь, вам придется использовать временное распределение, потомуnew_convert()
что он просто не получает такой фрагмент, поэтому его придется создать.