Rust 当没有类型参数或属性时,我如何暗示值的类型?
我试图将我的结构转换为Rust 当没有类型参数或属性时,我如何暗示值的类型?,rust,Rust,我试图将我的结构转换为HashMap,但在impl块中时无法这样做。由于机箱的原因,我只能使用&self作为解析功能的参数 use std::collections::HashMap; pub enum Value { Int(i64), Object(HashMap<String, Value>), } pub struct WeatherSettings { forecast_days: i64, } impl WeatherSettings {
HashMap
,但在impl块中时无法这样做。由于机箱的原因,我只能使用&self
作为解析
功能的参数
use std::collections::HashMap;
pub enum Value {
Int(i64),
Object(HashMap<String, Value>),
}
pub struct WeatherSettings {
forecast_days: i64,
}
impl WeatherSettings {
fn resolve(&self) -> Value {
let json_object: HashMap<String, Value> = *self.into();
Value::Object(json_object)
}
}
impl From<WeatherSettings> for HashMap<String, Value> {
fn from(weather: WeatherSettings) -> HashMap<String, Value> {
let mut json_object = HashMap::new();
json_object.insert("forecast_days".to_owned(),
Value::Int(weather.forecast_days));
return json_object;
}
}
fn main() {}
使用std::collections::HashMap;
发布枚举值{
Int(i64),
对象(HashMap),
}
发布结构设置{
预测天数:i64,
}
impl天气设置{
fn解析(&self)->值{
让json_对象:HashMap=*self.into();
值::对象(json_对象)
}
}
用于HashMap的impl-From{
fn from(天气:天气设置)->HashMap{
让mut json_object=HashMap::new();
json_object.insert(“forecast_days.”to_owned(),
值::Int(天气预报天数);
返回json_对象;
}
}
fn main(){}
更直接地说,我得到了错误:
错误:此值的类型在此上下文中必须是已知的
-->src/main.rs:14:51
|
14 |让json_对象:HashMap=*self.into();
| ^^^^^^^^^^^^
当没有类型参数或属性时,我如何暗示值的类型
在绝大多数情况下,Rust编译器可以根据泛型类型值的使用方式推断类型或函数的泛型类型
在某些情况下,没有足够的信息为泛型类型精确推断一种类型,但总有一种方法可以在类型参数存在时传递它们
这样做的两种方法是使用turbofish或在呼叫站点
大菱鲆
turbofish是附加到函数或类型的符号:
。看到它看起来像条鱼了吗
函数示例
定义如下:
pub const fn size_of<T>() -> usize.
impl<T> Vec<T> {
pub fn new() -> Vec<T>
}
trait From<T> {
fn from(T) -> Self;
}
您可以将其称为:
std::mem::size_of::<i8>()
// ^^^^^^ turbofish
Vec::<u8>::new()
// ^^^^^^ turbofish
<String as From<&str>>::from("a")
// ^^^^^^^^^^^^^^^^^^^^^^ fully qualified syntax
您可以将其称为:
std::mem::size_of::<i8>()
// ^^^^^^ turbofish
Vec::<u8>::new()
// ^^^^^^ turbofish
<String as From<&str>>::from("a")
// ^^^^^^^^^^^^^^^^^^^^^^ fully qualified syntax
那不是你的问题
要使此行有效,请执行以下操作:
let json_object: HashMap<String, Value> = *self.into();
这意味着您不能移动字符串,而是必须复制它们。这就是&self
设置的限制