【问题标题】:How can I add a Marker to a concrete type?如何将标记添加到具体类型?
【发布时间】:2015-03-03 04:58:54
【问题描述】:

我目前正在探索 Rust,但被以下问题难住了:

假设我想用 MarkerTrait “注释”一个函数参数(即,使 trait 成为注释):

use std::marker::MarkerTrait;

pub trait X: MarkerTrait { }

pub trait MyInterface {
    fn foo(&self, bar: u32+ X) -> u32;
}

// make this compile in the playpen
fn main() { }

到目前为止,编译器将拒绝它并显示以下内容:消息:

<anon>:6:25: 6:28 error: expected a reference to a trait [E0172]
<anon>:6     fn foo(&self, bar : u32 + X) -> u32;
                                 ^~~

这是一个错误还是故意的?如果是故意的,我应该使用什么解决方法将所需的信息添加到我的代码中?是否有其他方法来注释函数参数,例如棉绒可以捡起来吗?

编辑:好的,看来我问错了问题。在java中,函数参数可以被注释。我将如何在 Rust 中做类似的事情?

【问题讨论】:

  • 一个具体的类型加上一个界限并没有真正的意义。该类型将支持该特征(在这种情况下,您可以只接受该特征)或不支持。在同一编译期间,您不能让一种类型既实现特征又不实现特征。也许你可以解释更多关于你想做什么?你以哪种方式关心你有一个u32
  • “注释函数参数”到底是什么意思?除了参数的类型,你还能注释什么?

标签: rust


【解决方案1】:

Rust 确实有注释,它们可以应用于像 structs 或 fns 或 mods 这样的项目:

#[test]
fn what() {}

但是,如果您使用自己的:

#[my_attr]
fn what() {}

你得到一个错误:

error: The attribute `my_attr` is currently unknown to the the compiler and may have meaning added to it in the future
help: add #![feature(custom_attribute)] to the crate attributes to enable

您也不能为参数添加注释:

fn what(#[my_attr] a: u8) {}

有错误

error: unexpected token: `#`

话虽如此,我同意Levans' sentiment - 使用类型来编码信息。

我所知道的 Java 中最常见的参数注解是 @Nullable。在 Rust 中,这具有标准库支持,不依赖于外部元数据。您使用特殊类型来指示某个值不能存在 - Option

fn what(a: Option<u8>) {}

您还可以构建自己的类型来指示语义。也许您有一个处理距离的应用程序?创建一个表示该类型的类型:

struct Meters(i32);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-24
    • 1970-01-01
    • 2019-01-24
    • 1970-01-01
    • 1970-01-01
    • 2020-01-15
    相关资源
    最近更新 更多