- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到了一个编译错误,似乎突出显示了我对类型系统不了解的内容。
我想将字符串转换为整数,如果字符串不是有效整数,则带有自定义 panic 消息。我做一个match
在 Result
由 parse()
返回:
fn main() {
let x = match "23".parse() {
Ok(int) => int,
Err(_) => panic!("Not an integer!"),
};
println!("x plus 1 is {}", x+1);
}
(如果这真的是我在程序中所做的全部,我会使用
expect()
,但在实际程序中还有更多内容。)
24
编译并运行时。相反,会出现以下编译器错误:
error[E0277]: the trait bound `(): std::str::FromStr` is not satisfied
--> main.rs:2:24
|
2 | let x = match "23".parse() {
| ^^^^^ the trait `std::str::FromStr` is not implemented for `()`
问题似乎是 Rust 不知道我要解析的类型,这可能是一个问题是有道理的。如果我将第 2 行更改为以下内容,错误就会消失:
let x: i32 = match "23".parse() {
为什么我收到此错误消息,而不是指示需要类型注释?该消息似乎在提示错误臂没有返回任何东西(或者更准确地说,它返回的东西 - 即什么都没有 - 没有实现
FromStr
特征),但对我来说没有任何意义, 调用
panic!
后,匹配的那个分支的输出类型可能会产生任何影响——程序可能会展开堆栈并在该点立即终止,因此类型安全似乎无关紧要!
panic!
,我只返回一个整数(例如
Err(_) => 0
),代码编译良好(并按预期工作)。似乎在这种情况下,Rust 正确地将类型推断为
i32
第一次并且不会运行导致困惑错误的任何代码路径。
最佳答案
The message appears to be complaining that the error arm does not return anything (or more precisely, that what it returns -- namely nothing -- doesn't implement the
FromStr
trait).
panic!
的返回类型字面意思是
never type (
!
),它不同于
unit type (
()
)确实返回,尽管它返回的是“无”。
it doesn't make any sense to me that, after calling
panic!
, the type of the output of that arm of the match could have any effect whatsoever.
#![allow(unreachable_code)]
fn main() {
let _x: () = panic!();
let _y: i32 = panic!();
let _z: &dyn ToString = panic!();
}
但是,我们使用上面的一堆类型注释来操作返回类型,而不是任何类型提示,Rust 似乎解决了默认值
()
。对于返回
!
的表达式如您的示例的简化版本所示:
#![allow(unreachable_code)]
fn main() {
let x = panic!();
x + 5;
}
哪个抛出:
error[E0277]: cannot add `i32` to `()`
--> src/main.rs:15:7
|
15 | x + 5;
| ^ no implementation for `() + i32`
|
= help: the trait `std::ops::Add<i32>` is not implemented for `()`
这似乎是一个合理的选择,因为空表达式(例如空 block )评估为单元类型。
()
.这就是为什么推断您的错误臂返回
()
以及为什么你会得到
FromStr not implemented for ()
错误。
关于types - 为什么由于缺少类型注释而收到错误 "trait bound FromStr is not satisfied"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62628980/
我正在尝试在具有相同特征的盒装特征对象上实现特征。我以前对其方法采用的特征做过这样的事情&Self,它工作得很好,但不是Self。。我意识到在这个特定的例子中,我可以将fn get_*()函数更改为返
在编写带有特征的代码时,您可以将特征放在特征边界中: use std::fmt::Debug; fn myfunction1(v: Box) { println!("{:?}", v); }
我有一个特征正在使用另一个特征,现在我收到关于类中不存在的函数的错误。我简化了代码: 设置.php: getMessage());} } } ?> 数据库.php pdo=new PDO("m
这个问题在这里已经有了答案: Why doesn't Rust support trait object upcasting? (4 个回答) 2年前关闭。 如果我有 Box , 我可以返回 &dyn
给定这段代码: trait Trait {} struct Child; impl Trait for Child {} struct Father { child: &'a Box, } i
这个问题的标题与许多相关问题非常相似,但我还没有找到一个讨论这个特定问题的问题。 我有一个 Color非常简单定义的类型,如下所示: pub struct Color { red: u8,
我有三个特点。 Trait Param、GroupId 和 SessionId。特征 GroupId 和 SessionId 包括 Param。 类 GroupSession 包括特征 GroupId
查看 Traversable 和 TraversableLike 的 scaladoc,我很难弄清楚它们之间的区别是什么(除了一个扩展另一个)。文档中唯一明显的区别是它说 Traversable 是一
我有以下代码: trait T { type AT; fn foo(&self); } struct AbstractT { t: Box>, } impl T for Abs
如何在 Rust 中尝试类似以下的操作? builder 类是一个 trait 对象,它返回另一个 trait 对象(类型删除),其中选择的实现由我们正在使用的 builder trait 的特定对象
我想创建一个新向量,其中包含实现 Trait 的对象,来 self 已有的包含这些对象的一些向量。 trait Foo { // } struct Bar { i: i32, } st
到目前为止,在我的项目中,我使用了许多特征来允许在单元测试中模拟/ stub 以注入(inject)依赖项。然而,到目前为止我正在做的事情的一个细节似乎非常可疑,以至于我很惊讶它甚至可以编译。我担心正
假设我有一些特质: trait MyTrait { fn function1(&self); } 和一些实现它的类型: struct MyStruct { number: i32, }
更新:不止我一个人在思考这个问题,看来这确实是一个错误。参见 here .修复的那一天将是美好的一天! :) 这开始为 I love PHP traits! I'm going to use them
以下特征Parser[+T]是扩展接受 Input 的函数的特征并返回 Result[T] . trait Parser[+T] extends (Input => Result[T]) 那是对的吗
我有一个类型,我可以通过它访问它的方法 SomeTrait::::method() 但我不明白那和之间的区别 >::method() 在 C++ 中,我希望这样: SomeTrait::method(
在下面的代码中,不可能从对实现相同特征的动态大小类型的引用中获得对特征对象的引用。为什么会这样呢?如果我可以同时调用trait方法,那么&dyn Trait和&(?Sized + Trait)之间到底
我是 Rust 的新手,我想通过实现一些小项目来学习这门语言并更好地理解。我的第一次尝试是解析从 MQTT 代理收到的 JSON 数据。 我很高兴在 tornado 的帮助下轻松完成这项工作。和 se
在下面的代码中,不可能从对实现相同特征的动态大小类型的引用中获得对特征对象的引用。为什么会这样呢?如果我可以同时调用trait方法,那么&dyn Trait和&(?Sized + Trait)之间到底
这个问题在这里已经有了答案: Why is the `Sized` bound necessary in this trait? (2 个回答) 1年前关闭。 我有一个特质 Vertex我想要几个结构
我是一名优秀的程序员,十分优秀!