了解类型归属问题
Understanding type ascription issues
对不起,我很迷茫,不知道如何提出这个问题。如果您有更好的标题建议,请告诉我。
我键入ascription,发现它可以用我们想要的类型来注释表达式。
我定义了以下特征和函数。根据我有限的理解,我将类型指定为 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
是一个整数,而不是类型。
None 其中与参数的实际类型有关。只要有 (1, 6, 1)
就足以推断出它们是 u16
.
顺便说一句,可以利用结构和函数之间的这种区别来提供类似命名参数的东西。该函数不是单独获取参数,而是将结构作为其唯一参数。然后在调用该函数时,您使用其命名字段初始化一个结构并将其传递给该函数。您可以在这个方向上做更复杂的事情,但这是基础。
对不起,我很迷茫,不知道如何提出这个问题。如果您有更好的标题建议,请告诉我。
我
我定义了以下特征和函数。根据我有限的理解,我将类型指定为 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
是一个整数,而不是类型。
None 其中与参数的实际类型有关。只要有 (1, 6, 1)
就足以推断出它们是 u16
.
顺便说一句,可以利用结构和函数之间的这种区别来提供类似命名参数的东西。该函数不是单独获取参数,而是将结构作为其唯一参数。然后在调用该函数时,您使用其命名字段初始化一个结构并将其传递给该函数。您可以在这个方向上做更复杂的事情,但这是基础。