gpt4 book ai didi

rust - 当没有类型参数或归属时,我如何暗示值的类型?

转载 作者:行者123 更新时间:2023-11-29 08:05:13 24 4
gpt4 key购买 nike

我正在尝试将我的结构转换为 HashMap,但在 impl block 中我无法这样做。由于 crate constraint ,我只能使用 &self 作为 resolve 函数的参数。

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() {}

更直接地说,我得到错误:

error: the type of this value must be known in this context
--> src/main.rs:14:51
|
14 | let json_object: HashMap<String, Value> = *self.into();
| ^^^^^^^^^^^^

最佳答案

How do I imply the type of the value when there is no type parameters or ascriptions?

在绝大多数情况下,Rust 编译器可以根据泛型类型值的使用方式推断类型或函数的泛型类型。

在某些情况下,没有足够的信息来准确推断泛型类型的一种类型,但总有一种方法可以在类型参数存在时传递它们。

这样做的两种方法是使用 turbofishfully qualified syntax在调用站点。

涡轮鱼

涡轮鱼是符号::<Type1, Type2, ...>附加到函数或类型。看到它看起来像鱼了吗?

函数示例

mem::size_of 定义为:

pub const fn size_of<T>() -> usize.

你可以这样调用它:

std::mem::size_of::<i8>()
// ^^^^^^ turbofish

类型示例

Vec::new 定义为:

impl<T> Vec<T> {
pub fn new() -> Vec<T>
}

你可以这样调用它:

Vec::<u8>::new()
// ^^^^^^ turbofish

多种类型

如果您的函数有多种类型,您需要按照与定义相同的顺序为每种类型指定一些内容:

fn example<A, B>() {}

fn main() {
example::<i32, bool>();
// ^A ^B
}

完全限定语法

如果您需要通过类型参数消除对特定特征的方法调用的歧义,您可以使用完全限定语法。

From::from 定义为:

trait From<T> {
fn from(T) -> Self;
}

你可以这样调用它:

    <String as From<&str>>::from("a")
// ^^^^^^^^^^^^^^^^^^^^^^ fully qualified syntax

部分推断类型

如果可以提供多种类型但可以推断其中一些类型,您仍然可以使用_允许编译器推断该特定类型。


在这里,我在 Into 上使用涡轮鱼输入您的代码:

let json_object = *Into::<HashMap<String, Value>>::into(self);

但这不是你的问题。

要使这一行有效:

let json_object: HashMap<String, Value> = *self.into();

调用 self.into() 的结果必须是可以取消引用以生成类型 HashMap<String, Value> 的东西.编译器如何知道那是什么?这也不是您想要的。

你只有&self ,所以这就是你必须转换的内容。实现对结构的引用的特征:

impl<'a> From<&'a WeatherSettings> for HashMap<String, Value> {
fn from(weather: &'a WeatherSettings) -> HashMap<String, Value> {
let mut json_object = HashMap::new();
json_object.insert("unit".to_owned(), Value::String(weather.unit.clone()));
json_object.insert("forecast_days".to_owned(), Value::Int(weather.forecast_days));
json_object.insert("data".to_owned(), Value::String(weather.data.clone()));
json_object
}
}

这意味着您不能移动字符串,而必须复制它们。这是 &self 设置的限制.

关于rust - 当没有类型参数或归属时,我如何暗示值的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41882151/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com