在定义表单的某些元组结构时,我有几个宏来减少样板:
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在文档注释中展开令牌.剩下的唯一选择是在宏中编写非常通用的文档,但这会导致我的库文档记录得比它更糟糕.
您对此有何建议?对我来说最好的解决方案是能够为每个宏调用编写特定的文档,但如果不可能,我会很感激有关如何在文档注释中扩展标记的提示.
我有这个:
#[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在相当高级的情况下执行类型推断.有人可以解释(或指向)描述可以和不可推断的内容的规则吗?
第一个很简单:绑定的类型是绑定表达式的类型:
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)
类型推断和类型推导的规则是什么?
我想在内存中表示一个数据表,如下所示:
| 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; 我只想通过枚举方便地访问数组/地图项.
我有一个枚举:
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) 我有这个代码:
#[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) 给定一个带有一些未键入值的简单枚举,可能希望此枚举的大小使用较小的整数类型,然后使用默认值.例如,这提供了将枚举存储在数组中的能力u8.
enum MyEnum {
A = 0,
B,
C,
}
Run Code Online (Sandbox Code Playgroud)
可以使用u8数组并将它们与某些常量进行比较,但我希望使用枚举来确保在匹配语句中处理所有可能性.
如何指定它以size_of匹配所需的整数类型?
我正在为 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) 在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?
即使我明确指定了所有类型,似乎也会发生某种隐式类型转换?