处理值枚举时类型不匹配
Mismatched types on handling Value enum
我正在尝试使用 rmp_rpc
Rust 库制作一个服务器,该服务器接受来自用 Python 编写的客户端的命令。我正在修改 this 示例以实现我的目标。
如何在不出现 "mismatched types; expected i32, found enum 'rmp_rpc::Value'" 错误的情况下将不同类型 (integer/string/boolean) 的参数处理到匹配语句中?对于每种方法,参数类型可能不同。
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])
}
您需要在调用站点执行类型检查,或者将类型检查推迟到被调用方(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
}
}
根据 Simon 的说法,我所做的是
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>
为了避免不兼容的类型错误
我正在尝试使用 rmp_rpc
Rust 库制作一个服务器,该服务器接受来自用 Python 编写的客户端的命令。我正在修改 this 示例以实现我的目标。
如何在不出现 "mismatched types; expected i32, found enum 'rmp_rpc::Value'" 错误的情况下将不同类型 (integer/string/boolean) 的参数处理到匹配语句中?对于每种方法,参数类型可能不同。
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])
}
您需要在调用站点执行类型检查,或者将类型检查推迟到被调用方(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
}
}
根据 Simon 的说法,我所做的是
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>
为了避免不兼容的类型错误