LINUX.ORG.RU

Пара нубских вопросов по Rust

 


1

3

Доброго времени суток, ЛОР!

В попытках разобраться с Rust'ом не понял две вещи:

  1. Трейта для коллекций (чтобы были определены всякие push, pop и т.д.) не существует? Или я плохо ищу? Или есть в планах? Или это не нужно, потому что коллекции слишком разные, например?
  2. Попробовал наговнокодить, чтобы компилятор мне что-нибудь подсказал насчёт первого вопроса, но как-то не вышло:
    fn shift<T, U>(v: &mut U<T>) {
        let i = v.pop().unwrap();
        v.insert(0, i);
    }
    src/main.rs:1:26: 1:27 error: type parameters are not allowed on this type [E0109]
    src/main.rs:1 fn shift<T, U>(v: &mut T<U>) {
                                           ^
    
    Потом чуть подумал и понял, что надо, наверное, просто T, но что делать, если мне нужно будет уточнить, например, что должен уметь именно U? Или я что-то совершенно неправильно понимаю?

P.S. Уж не обессудьте, мозг повреждён питоном и ударом об пол в детстве.

UPD: Первый вопрос (если предположить, что нужного трейта нет), наверное, решается макросом. Но мне отчего-то кажется, что это оверкилл.

Deleted

А, кстати, разве в расте вообще можно T<U> делать? В плюсах вон запилили недавно.

mix_mix ★★★★★ ()
Ответ на: комментарий от mix_mix

А, кстати, разве в расте вообще можно T<U> делать? В плюсах вон запилили недавно.

Видимо, нет, потому и спрашиваю.

Deleted ()

Трейта для коллекций (чтобы были определены всякие push, pop и т.д.) не существует?

Общего нет, насколько я вижу. Есть только Index для контейнеров поддерживающих обращения по индексу (через скобки []), FromIterator/IntoIterator и Extend.

Потом чуть подумал и понял, что надо, наверное, просто T, но что делать, если мне нужно будет уточнить, например, что должен уметь именно U?

T<U> нельзя, да. Обсуждается и HKT хотят сделать.

UPD: Первый вопрос (если предположить, что нужного трейта нет), наверное, решается макросом.

Оно ещё и решается трейтами FromIterator/IntoIterator - сначала преобразуешь в итератор (IntoIterator), потом делаешь ему rev, потом обратно (FromIterator).

DarkEld3r ★★★★★ ()
Последнее исправление: DarkEld3r (всего исправлений: 1)
Ответ на: комментарий от mix_mix

В полюсах всю жизнь так можно было. Шаблонные параметры шаблона.

anonymous ()

Влом разбираться как лучше такое с мутабельной ссылкой сделать, но думаю такой вариант устроит:

fn shift<C, T, It>(v: C) -> C 
    where C: IntoIterator<Item = T, IntoIter = It> + FromIterator<T>,
          It: DoubleEndedIterator<Item = T> {
    C::from_iter(v.into_iter().rev())
}

let b = shift(vec![2, 3, 4]);
println!("{:?}", b);

DarkEld3r ★★★★★ ()
Последнее исправление: DarkEld3r (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.