了解类型归属问题



很抱歉,我太迷路了,不知道该如何回答这个问题。如果你对更好的标题有什么建议,请告诉我。

我研究了类型归属,发现它是用我们希望它具有的类型来注释表达式的能力。

我定义了以下特征和功能。根据我有限的理解,我将指定类型为u16:

//  src/range.rs
pub struct Range {
pub min: u16,
pub max: u16,
pub current: u16
}
impl Range {
pub fn new(min: u16, max: u16, current: u16) -> Self {
Range{ min, max, current }
}

接下来,我想在integration_tests:中测试new()

//  tests/integration_tests.rs
use confine::range::Range;
#[test]
fn new_confine() {
assert_eq!(Range{min: 1, max: 6, cursor: 1}, Range::new(min: 1, max: 6, cursor: 1));

当我明确将结构定义为u16时,为什么编译器会被类型混淆?我也尝试过显式地编写1u16

我收到以下错误:

error: expected type, found `1`
--> tests/integration_test.rs:5:70
|
5 |     assert_eq!(Confine{min: 1, max: 6, cursor: 1}, Confine::new(min: 1, max: 6, cursor: 1));
|                                                                    - ^ expected type
|                                                                    |
|                                                                    tried to parse a type due to this type ascription
|

这是在Rust中初始化结构和调用函数的主要区别。初始化结构时,字段是命名的(假设结构具有命名字段(,但函数当前不支持命名参数。

要调用Confine::new,只需省略min:max:cursor:

assert_eq!(
Range {min: 1, max: 6, cursor: 1},
Range::new(1, 6, 1)
);

现在解释错误。函数的自变量是逗号分隔的表达式列表,因此(例如(min: 1被解析为表达式。直到:。包含:的表达式(至少在那个位置(必须是类型归属(这是不稳定的,但仍然在语法中实现(。这意味着min: 1的其余部分必须是一个类型,因此1被解析为一个类型。这显然是错误的,因为1是一个整数,而不是一个类型。

这些都和参数的实际类型无关。只要具有如上所述的(1, 6, 1)就足以推断它们是u16


顺便说一句,结构和函数之间的这种区别可以用来提供类似命名参数的东西。该函数不单独使用参数,而是将结构作为其唯一的参数。然后,在调用函数时,使用其命名字段初始化结构,并将其传递给函数。在这个方向上,你可以做一些更复杂的事情,但这是最基本的。

相关内容

最新更新