Как я могу переслать / псевдоним / делегировать функцию в метод? - PullRequest
1 голос
/ 30 января 2020

Я хочу переслать функцию методу в другом модуле, без повторения всех аннотаций типов и без ручной передачи параметров. Как бы я это сделал?

mod other_mod;

static client: other_mod::Client = other_mod::Client::new();

async fn search = client.search; // How to do this here?

mod other_mod:

pub struct Client();

impl Client {
    pub fn new() -> Self {
        Self()
    }    

    pub async fn search(&self, query: &str) -> Result<Vec<SearchResultItem>> { ... }

}

Ответы [ 2 ]

4 голосов
/ 30 января 2020

Нет способа сделать это в Rust.

2 голосов
/ 31 января 2020

Основная проблема с вашим примером, это static Client:

  • Это не может быть создано, потому что Rust не позволяет жизнь до или после main.
  • Это не может быть изменен без использования unsafe, из соображений безопасности потоков.

Вы можете создать Client, если сделаете его new функцию const.

Затем вы можете сделать это pub, и переадресация функции вообще не требуется, пользователи могут просто позвонить CLIENT.search.

pub static CLIENT: other_mod::Client = Client::new();

Вы также можете рефакторинг other_mod в выставить функцию search как отдельную:

pub async fn search(query: &str) -> ...

, а затем переслать ее по-своему:

pub use other_mod::search;

Нет просто средств для перенаправления методов на глобальные переменные ; На глобальные переменные ржавеет хрен sh, потому что они открывают всевозможные проблемы, поэтому я сомневаюсь, что такой синтаксис c сахара появится в ближайшее время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...