String FromStr和TryFrom的区别是什么<;字符串>;特点?
在Rust中使用Serde板条箱时,我尝试将一个String FromStr和TryFrom的区别是什么<;字符串>;特点?,string,rust,type-conversion,String,Rust,Type Conversion,在Rust中使用Serde板条箱时,我尝试将一个#[Serde(try_from=String)]添加到一个实现FromStr的类型中,从而可以从String中解析。不幸的是,对于Serde来说,这似乎还不够,从编译器错误消息中可以明显看出,我也必须手动实现TryFrom 为什么对于所有实现FromStr的类型,TryFrom不会自动实现?为什么字符串的易错转换有一个单独的特性?这两种特性之间有什么区别?是一种通用特性,可用于“任何”类型。从文件中: 简单安全的类型转换,在某些情况下可能以受控方
#[Serde(try_from=String)]
添加到一个实现FromStr
的类型中,从而可以从String中解析。不幸的是,对于Serde来说,这似乎还不够,从编译器错误消息中可以明显看出,我也必须手动实现TryFrom
为什么对于所有实现FromStr
的类型,TryFrom
不会自动实现?为什么字符串的易错转换有一个单独的特性?这两种特性之间有什么区别?是一种通用特性,可用于“任何”类型。从文件中:
简单安全的类型转换,在某些情况下可能以受控方式失败
Type->Type
它还提供了的自动实现
主要用于解析类型,也根据文档:
FromStr的FromStr方法通常通过str的parse方法隐式使用
str->Type
实现它以供使用是一种通用特性,可用于“任何”类型。从文件中:
简单安全的类型转换,在某些情况下可能以受控方式失败
Type->Type
它还提供了的自动实现
主要用于解析类型,也根据文档:
FromStr的FromStr方法通常通过str的parse方法隐式使用
str->Type
将其用于
fromstrust
在Rust 1.0中稳定,TryFrom
在Rust 1.34中稳定;在它存在之前很难使用它
为什么对于所有实现FromStr
的类型,TryFrom
不会自动实现
这将导致已实现TryFrom
和FromStr
的类型不明确。为了实现这一点,需要一种高级的专业化形式
为什么字符串的易出错转换有一个单独的特性
FromStr
从借用的字符串片段(&str
)创建一个拥有的值,因此它在语义上不同于获取字符串的所有权TryFrom
将允许您重用为字符串分配的内存
更接近的模拟是,impl for…
,但是在从字符串解析值的“简单”情况下,在trait中具有生存期使得使用它更加复杂
另见:
FromStr
在锈1.0中稳定,TryFrom
在锈1.34中稳定;在它存在之前很难使用它
为什么对于所有实现FromStr
的类型,TryFrom
不会自动实现
这将导致已实现TryFrom
和FromStr
的类型不明确。为了实现这一点,需要一种高级的专业化形式
为什么字符串的易出错转换有一个单独的特性
FromStr
从借用的字符串片段(&str
)创建一个拥有的值,因此它在语义上不同于获取字符串的所有权TryFrom
将允许您重用为字符串分配的内存
更接近的模拟是,impl for…
,但是在从字符串解析值的“简单”情况下,在trait中具有生存期使得使用它更加复杂
另见:
我认为答案是“出于历史原因”的平均值:str
的AFAIK要老得多,而TryFrom
只是后来才添加的。然而,您所期望的trait自动实现听起来是合乎逻辑的,可能是由于技术原因而无法轻松实现。您可能会发现,serde_with
允许您这样做很有用,并且还有许多其他方便的功能,请访问serde_with
的链接。我会看一看,但由于我的项目目标是m,我对额外的依赖关系相当敏感,以防它们增加输出大小。我认为答案是“出于历史原因”的平均值:AFAIKfromstry
要老得多,而TryFrom
是后来才添加的。然而,您所期望的trait自动实现听起来是合乎逻辑的,可能是由于技术原因而无法轻松实现。您可能会发现,serde_with
允许您这样做很有用,并且还有许多其他方便的功能,请访问serde_with
的链接。我会看一看,但由于我的项目目标是m,我对额外的依赖性相当敏感,以防它们增加输出大小。我应该注意到这两种特性都有不同的生命周期要求。不过,从
实现TryFrom和使用#[serde(try_from=“&str”)]
似乎效果不错。我应该注意到,这两种特性都有不同的寿命要求。不过,从
实现尝试并使用#[serde(try_from=“&str”)]
似乎效果不错。