我试图用宏定义一个特征。
我还没有找到与方法声明相匹配的片段说明符,我最好能得到以下内容:
macro_rules! decorated_trait (
($tid:ident {
$( fn $b:ident($($args:expr),*) );*
}) => {
trait $tid {
fn default_function(&self, _x: i32, _y: &str) {
}
$( fn $b( $( $args ),* ); )*
}
};
);
decorated_trait!(MyTrait {
fn my_function(&self, x: i32);
fn another(&self)
});
struct Foo {}
impl MyTrait for Foo {
fn my_function(&self) {
self.default_function(1, "bar");
}
fn another(&self) {}
}
fn main() {
let _foo = Foo{};
}
错误是:
error: expected type, found `&self`
--> src/main.rs:11:26
|
11 | $( fn $b( $( $args ),* ); )*
| ^^^^^
虽然在技术上可以正确匹配trait方法的参数。。。不值得这么麻烦。只需将它们作为原始标记进行匹配:
macro_rules! decorated_trait (
($tid:ident {
$( fn $b:ident($($args:tt)*) );*
}) => {
trait $tid {
fn default_function(&self, _x: i32, _y: &str) {
}
$( fn $b( $( $args )* ); )*
}
};
);
宏无法工作的原因是参数不是类型。它们是一个可选的“self
-ish”参数,可以采用多种不同的形式,后跟零对或多对pattern:type
对,除非它们没有模式。
就像我说的,不值得这么麻烦。
Rust 提供了一个强大的宏系统,可进行元编程(metaprogramming)。正如你已经看过了前面章节,宏看起来和函数很像,除了名称末尾连着一个感叹号 ! ,但宏并不产生一个函数调用,而是展开成源码并结合程序的其余代码一起进行编译。 宏是通过 macro_rules! 宏来创建的。 // 这是一个简单简单的宏,名为 `say_hello`。 macro_rules! say_hello {
我发现自己写的代码是这样的: 很多次了。我试图创建一个宏来为我输出此函数: 但无论我为元变量选择什么片段说明符(,,,,它们的组合),它都会出错。有什么魔法咒语能让它起作用? 类型和如下所示: 铁锈操场上的一个(错误)例子。 当然这里有一个XY问题:我使用的是diesel板条箱,它的结构上有派生impl,我希望能够
目标 在这一章中,我们将混合特征匹配和来自 calib3d 的单应性匹配来从一个复杂的图像中寻找已知的物体。 基础 我们在上节课做了什么?我们使用了一个 queryImage,在其中找到了一些特征点,我们又拿了一个 trainImage,在那个图像中也找到了这些特征,并且找到了它们之间最好的匹配。 总之,我们在另一个混乱的图像中发现了一个物体某些部分的位置。这些信息足以在 trainImage 上
宏里面的参数使用一个美元符号 $ 作为前缀,并使用一个指示符(designator)来注明类型: macro_rules! create_function { // 此宏接受一个 `ident` 指示符参数,并创建一个名为 `$func_name` // 的函数。 // `ident` 指示符用于变量名或函数名 ($func_name:ident) => (
通读ANSI C Yacc语法规范后,我注意到以下内容都是有效的: 这对我来说似乎很奇怪,因为我对类型的理解表明这些变量都没有类型。这些是什么意思?如何检查它们的类型?分配了多少内存?
问题内容: 因此,我认为我对Java中的异常处理有很好的基本了解,但是最近我正在阅读一些使我有些困惑和怀疑的代码。我要在这里解决的主要疑问是,何时一个人使用时会抛出如下所示的Java方法声明: 通过阅读一些类似的文章,我收集到的 引发信息 被用作一种声明, 表明 可以在方法执行期间引发 SomeException 。 我的困惑来自一些看起来像这样的代码: 在此示例中,您是否有任何理由要使用 抛出