Можно ли узнать, является ли переменная ссылкой во время компиляции в Rust?

Если вы просто хотите узнать, на rust что указывает ссылка, вы rust можете использовать черту rust ToOwned (например, ::Owned будет оцениваться rust как String). Однако мне кажется, что rust вам может понадобиться Cow<'a, T>. Их rust название расшифровывается rust как Clone On Write. По своей rust сути они представляют собой rust просто перечисление либо rust ссылки, либо принадлежащего rust значения.

pub enum Cow<'a, B> 
where
    B: 'a + ToOwned + ?Sized, 
{
    Borrowed(&'a B),
    Owned(::Owned),
}

Они могут быть чрезвычайно rust полезны для операций со строками rust и срезами, когда вам может rust потребоваться изменить ввод, но rust вы не хотите копировать все rust данные, если ввод уже действителен. Основное rust преимущество заключается rust в том, что их можно рассматривать rust как собственные значения, но rust при этом вы можете гибко rust переключаться между ними rust в зависимости от производительности.

use std::borrow::Cow;

pub fn remove_fives(slice: &[i32]) -> Cow<[i32]> {
    if slice.iter().any(|x| *x == 5) {
        // We found some 5s to remove so we need to clone the input and remove them
        // from the result. This creates a new Vec we can modify.
        let mut owned_values = slice.to_owned();
        owned_values.retain(|x| *x != 5);
        
        Cow::Owned(owned_values)
    } else {
        // No fives were found so no we don't need to allocate anything or do extra work
        Cow::Borrowed(slice)
    }
}

Как rust забавный момент, если мы rust интерпретируем только заголовок rust вопроса, не так уж сложно rust написать простую функцию rust is_ref(), которая преобразуется в rust значение во время компиляции. Он rust использует черты в поместье, похожем rust на гораздо более полезный rust ящик impls. Это может быть интересно, но, вероятно, не rust так уж и полезно.

pub const fn is_ref() -> bool {
    trait IsNotRef {
        const IS_REF: bool = false;
    }
    
    impl IsNotRef for A {}
    
    struct Wrapper(::std::marker::PhantomData);
    
    impl<'a, A: ?Sized> Wrapper<&'a A> {
        const IS_REF: bool = true;
    }
    
    impl<'a, A: ?Sized> Wrapper<&'a mut A> {
        const IS_REF: bool = true;
    }
    
    >::IS_REF
}

rust

2022-11-28T05:58:55+00:00