Несоответствующие типы при обработке значения enum - PullRequest
0 голосов
/ 04 июля 2018

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

Как я могу обработать аргумент различного типа (целое число / строка / логическое значение) в операторе сопоставления, не получая сообщение «несоответствующие типы; ожидается, что i32, найден enum« rmp_rpc :: Value »»? Для каждого метода типы параметров могут быть разными.

fn handle_request(&mut self, method: &str, params: &[Value]) -> Self::RequestFuture {
        match method {
            "sum" => Methods::sum(params[0], params[1]),
            "draw" => Methods::draw(params),
            "conc" => Methods::concatenate(params[0], params[1])
        }

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

То, что я сделал по Саймону, было
match method { "sum" => Methods::sum(params[0].as_u64().expect("expected u64"), params[1].as_u64().expect("expected u64")), "conc" => Methods::concatenate(params[0].as_str().expect("expected str"), params[1].as_str().expect("expected str")), "draw" => Methods::draw(params), _ => Err("invalid argument".into()) }
но также исправьте вывод каждой функции в Result <'Value, Value> во избежание несовместимости ошибок типа

0 голосов
/ 05 июля 2018

Вам необходимо либо выполнить проверку типа здесь на сайте вызова, либо отложить проверку типа для вызываемого абонента (методы Echo::<whatever>).

На сайте звонка:

match method {
    "sum" => Echo::sum(params[0].as_u64().expect("expected u64"), params[1].as_u64().expect("expected u64")),
    "draw" => Echo::draw(params), // <-- this must continue to be passed as &[Value]
    "concatenate => Echo::conc(params[0].as_str().expect("expected str"), params[1].as_str().expect("expected str"))
}

В звонящем:

impl Echo {
    pub fn sum(v1: Value, v2: Value) -> u64 {
        let v1 = v1.as_u64().expect("expected u64");
        let v2 = v2.as_u64().expect("expected u64");

        v1 + v2
    }
}

Это на основе документации, которую я мог найти доступной .

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