首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解类型归属问题

理解类型归属问题
EN

Stack Overflow用户
提问于 2020-05-01 02:53:13
回答 1查看 381关注 0票数 1

对不起,我太迷茫了,我不知道该怎么回答这个问题。如果你有更好的标题的建议,请告诉我。

I researched类型归属,并发现它能够用我们希望它拥有的类型对表达式进行注释。

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

代码语言:javascript
复制
//  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 }
    }

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

代码语言:javascript
复制
//  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

我收到以下错误:

代码语言:javascript
复制
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
  |
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-01 03:35:34

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

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

代码语言:javascript
复制
assert_eq!(
    Range {min: 1, max: 6, cursor: 1},
    Range::new(1, 6, 1)
);

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

所有这些都与参数的实际类型无关。仅仅拥有上面的(1, 6, 1)就足以推断它们是u16了。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61536102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档