相关疑难解决方法(0)

在宏中生成文档

在定义表单的某些元组结构时,我有几个宏来减少样板:

macro_rules! new_type (($name:ident, $bytes:expr) => (
    pub struct $name(pub [u8; $bytes]);
    // some common operations on $name
));
Run Code Online (Sandbox Code Playgroud)

但是,我还要记录这些新结构.如果我能在宏调用之前编写我的文档,最好的事情就是.

/// A certain type
new_type!(CertainType, 42);
Run Code Online (Sandbox Code Playgroud)

但是,Rust不会生成CertainType发生这种情况的文档.

另一种(不那么灵活)替代方案是做类似的事情:

macro_rules! new_type (($name:ident, $bytes:expr) => (
    /// Some more generic documentation for $name 
    pub struct $name(pub [u8; $bytes]);
    // some common operations on $name
));
Run Code Online (Sandbox Code Playgroud)

但是,在执行此操作时,Rust宏系统不会$name在文档注释中展开令牌.剩下的唯一选择是在宏中编写非常通用的文档,但这会导致我的库文档记录得比它更糟糕.

您对此有何建议?对我来说最好的解决方案是能够为每个宏调用编写特定的文档,但如果不可能,我会很感激有关如何在文档注释中扩展标记的提示.

macros rust

25
推荐指数
1
解决办法
2392
查看次数

如何修复"在此范围内找不到派生宏"?

我有这个:

#[derive(FromPrimitive)]
pub enum MyEnum {
    Var1 = 1,
    Var2
}
Run Code Online (Sandbox Code Playgroud)

还有一个错误:

error: cannot find derive macro `FromPrimitive` in this scope                                                                                                 
   |                                                                                                                                                          
38 | #[derive(FromPrimitive)]                                                                                                                                 
   |          ^^^^^^^^^^^^^   
Run Code Online (Sandbox Code Playgroud)

为什么我这样做?我如何解决它?

rust

17
推荐指数
1
解决办法
8161
查看次数

Rust的类型推断如何跨多个语句工作?

Rust在相当高级的情况下执行类型推断.有人可以解释(或指向)描述可以和不可推断的内容的规则吗?

第一个很简单:绑定的类型是绑定表达式的类型:

let n = 10u32;

// Same as:
//   vvvvv
let n: u32 = 10u32;
Run Code Online (Sandbox Code Playgroud)

下一个对我来说更令人惊讶:右边的泛型参数是从左边的绑定类型中推导出来的:

let n: u32 = "10".parse().unwrap();

// same as:            vvvvvvv
let n: u32 = "10".parse::<u32>().unwrap();
Run Code Online (Sandbox Code Playgroud)

这也适用于泛型类型的"成员函数":

let b = Box::new(10u32);

// same as:
//        vvvvv      vvvvvvv
let b: Box<u32> = Box::<u32>::new(10u32);
Run Code Online (Sandbox Code Playgroud)

但最奇怪的是跨语句的类型推断:

let v = Vec::new();   // no type!
v.push(10u32);        // apparently v is Vec<u32>?!
// v.push(10i32);     // type error
Run Code Online (Sandbox Code Playgroud)

类型推断和类型推导的规则是什么?

type-inference rust

16
推荐指数
1
解决办法
1409
查看次数

有没有办法通过Rust中的枚举索引数组?

我想在内存中表示一个数据表,如下所示:

     | USD | EUR |
-----+-----+-----+
John | 100 | 50  |
-----+-----+-----+
Tom  | 300 | 200 |
-----+-----+-----+
Nick | 200 | 0   |
-----+-----+-----+
Run Code Online (Sandbox Code Playgroud)

有一组已知的人,他们每个人都拥有一些货币.

我有以下枚举:

enum Person {
    John,
    Tom,
    Nick
}

enum Currency {
    USD,
    EUR
}
Run Code Online (Sandbox Code Playgroud)

我想将这些数据编码为2D数组,能够索引数组元素而不是通过usize它来编写数组元素会很酷enum.例如:

data[Person::John][Currency::USD] = 100;
Run Code Online (Sandbox Code Playgroud)

是否可以使用Rust中的数组和枚举?或者是否有任何其他数据结构可以为此服务?

我知道HashMap,但这不是我想要的,因为:

  • HashMap 在堆上工作(这使得它比常规堆栈分配的数组慢得多)

  • HashMap我不能保证项目存在.例如,每次我想得到的东西,我必须解开它并处理None案例,与普通数组的使用相比,这不是很方便.

这与我如何将枚举值与整数匹配不同因为我对转换enum不感兴趣usize; 我只想通过枚举方便地访问数组/地图项.

arrays enums hashmap rust

8
推荐指数
2
解决办法
2360
查看次数

如何确保在编译时可以从特定函数返回每个枚举变量?

我有一个枚举:

enum Operation {
    Add,
    Subtract,
}

impl Operation {
    fn from(s: &str) -> Result<Self, &str> {
        match s {
            "+" => Ok(Self::Add),
            "-" => Ok(Self::Subtract),
            _ => Err("Invalid operation"),
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我想确保在编译时在from函数中处理每个枚举变量。

我为什么需要这个?例如,我可能添加一个Product操作而忘记在from函数中处理这种情况:

enum Operation {
    // ...
    Product,
}

impl Operation {
    fn from(s: &str) -> Result<Self, &str> {
        // No changes, I forgot to add a match arm for `Product.
        match s {
            "+" => Ok(Self::Add),
            "-" => Ok(Self::Subtract),
            _ …
Run Code Online (Sandbox Code Playgroud)

enums rust

7
推荐指数
2
解决办法
847
查看次数

使用 From 特征触发将 u8 转换为枚举

我有这个代码:

#[derive(PartialEq, PartialOrd)]
enum ValueType {
    k1,
    k2,
    kUnknown,
}

impl ValueType {
    fn value(&self) -> u8 {
        match *self {
            ValueType::k1 => 0x0,
            ValueType::k2 => 0x1,
            ValueType::kUnknown => 0xff,
        }
    }
}

impl From<u8> for ValueType {
    fn from(orig: u8) -> Self {
        match orig {
            0x0 => return ValueType::k1,
            0x1 => return ValueType::k2,
            _ => return ValueType::kUnknown,
        };
    }
}

fn main() {
    let a: ValueType = 0x0 as u8; // error, expected enum `ValueType`, found u8
} …
Run Code Online (Sandbox Code Playgroud)

rust

6
推荐指数
1
解决办法
9314
查看次数

如何在Rust中指定枚举的基础类型?

给定一个带有一些未键入值的简单枚举,可能希望此枚举的大小使用较小的整数类型,然后使用默认值.例如,这提供了将枚举存储在数组中的能力u8.

enum MyEnum { 
    A = 0,
    B,
    C,
}
Run Code Online (Sandbox Code Playgroud)

可以使用u8数组并将它们与某些常量进行比较,但我希望使用枚举来确保在匹配语句中处理所有可能性.

如何指定它以size_of匹配所需的整数类型?

enums rust

3
推荐指数
1
解决办法
2361
查看次数

如何将 bindgen 生成的 C 样式枚举转换为另一个枚举?

我正在为 C 库和 Bindgen 生成的枚举在 Rust 中创建绑定,例如:

// Rust
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub enum rmw_qos_history_policy_t {
    RMW_QOS_POLICY_HISTORY_SYSTEM_DEFAULT = 0,
    RMW_QOS_POLICY_HISTORY_KEEP_LAST = 1,
    RMW_QOS_POLICY_HISTORY_KEEP_ALL = 2,
    RMW_QOS_POLICY_HISTORY_UNKNOWN = 3,
}
Run Code Online (Sandbox Code Playgroud)

我需要将这些转换为:

// Rust
pub enum QoSHistoryPolicy {
    SystemDefault = 0,
    KeepLast = 1,
    KeepAll = 2,
    Unknown = 3,
}
Run Code Online (Sandbox Code Playgroud)

从这个 C 库导入常量值时:

// Rust
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub enum rmw_qos_history_policy_t {
    RMW_QOS_POLICY_HISTORY_SYSTEM_DEFAULT = 0,
    RMW_QOS_POLICY_HISTORY_KEEP_LAST = 1,
    RMW_QOS_POLICY_HISTORY_KEEP_ALL = 2,
    RMW_QOS_POLICY_HISTORY_UNKNOWN = 3,
} …
Run Code Online (Sandbox Code Playgroud)

enums rust rust-bindgen

2
推荐指数
1
解决办法
454
查看次数

Rust如何从From :: <> :: from()推断出结果类型?

在Hyper的例子的这个片段中,有一些代码我已经用成功编译的类型注释:

.map_err(|x: std::io::Error| -> hyper::Error {
    ::std::convert::From::<std::io::Error>::from(x)
})
Run Code Online (Sandbox Code Playgroud)

类型定义From::from()似乎是fn from(T) -> Self;

当我给出的任何泛型和参数都不是类型的时候,看起来似乎是什么似乎std::io::Error -> Self返回一个hyper::Error值怎么样hyper::Error

即使我明确指定了所有类型,似乎也会发生某种隐式类型转换?

rust

0
推荐指数
1
解决办法
135
查看次数

标签 统计

rust ×9

enums ×4

arrays ×1

hashmap ×1

macros ×1

rust-bindgen ×1

type-inference ×1