- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试编写一个通用解决方案来为单元测试 Rust 代码提供固定装置。我想出了一个宏,它允许用户定义setup 和teardown 方法。到目前为止,这是我的解决方案:
struct FooTestFixture {
pub name : String
}
impl FooTestFixture {
fn setup() -> FooTestFixture {
FooTestFixture { name: String::from("Initialised") }
}
}
fn teardown(fixture : &mut FooTestFixture) {
fixture.name = "".to_string();
}
macro_rules! unit_test {
($name:ident $fixt:ident $expr:expr) => (
#[test]
fn $name() {
let mut $fixt : FooTestFixture = FooTestFixture::setup();
$expr;
teardown(&mut $fixt);
}
)
}
unit_test! (heap_foo_fixture_should_be_initialised_using_macro f {
assert_eq!(f.name, "Initialised");
});
这行得通。唯一的问题是,宏 unit_test 不是通用的,并且绑定(bind)到夹具名称 FooTestFixture。这意味着每个测试模块都需要为每个测试夹具重新定义这个宏,这是不理想的。我希望能够做的是还引入一个类型变量并在宏扩展中使用该类型。深入研究宏,我发现有一个“ty”项目,它代表一种类型,我想我可以做到这一点......
macro_rules! unit_test {
($name:ident $fixt:ident $ftype:ty $expr:expr) => (
#[test]
fn $name() {
let mut $fixt : $ftype = $ftype::setup();
$expr;
teardown(&mut $fixt);
}
)
}
unit_test! (heap_foo_fixture_should_be_initialised_using_macro FooTestFixture f {
assert_eq!(f.name, "Initialised");
});
但是,这不起作用并导致以下错误:
src\tests\heap_fixture_with_new.rs:48:40: 48:50 error:
$ftype:ty
is followed by$expr:expr
, which is not allowed forty
fragments src\tests\heap_fixture_with_new.rs:48 ($name:ident $fixt:ident $ftype:ty $expr:expr) => (
如您所见,在宏定义中,我已将对 FooTestFixture 的引用替换为 $ftype。
我想要实现的目标可行吗?这几乎就像我希望宏是通用的,允许您传入一个类型,以便在宏定义中使用。
最佳答案
好吧,我意识到我根本不需要ty
。我可以将类型指定为 ident
参数,这样下面的代码就可以工作了:
macro_rules! unit_test {
($name:ident $fixt:ident $ftype:ident $expr:expr) => (
#[test]
fn $name() {
let mut $fixt = $ftype::setup();
$expr;
teardown(&mut $fixt);
}
)
}
unit_test! (foo_fixture_should_be_initialised_using_generic_macro f FooTestFixture {
assert_eq!(f.name, "Initialised");
});
关于unit-testing - 如何在 Rust 宏中使用 ty,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37058836/
为了在 Rust 中编写另一个 lint,我需要确保 Expr 的类型实际上是 Option (或任何指向一个的指针)。我已经走过任何ptr s 和 rptr得出他们的结论并留下一个 rustc::m
struct A { x: i64, } macro_rules! foo { ($T:ty) => { fn test() -> $T { $
这是有效的 C++(考虑到最新标准)吗?我在 Ubuntu 12.04 上遇到了 near-top-of-tree clang/libc++ 的编译错误。如果它应该是有效的,我会邮寄带有错误消息等的
我正在尝试编写一个通用解决方案来为单元测试 Rust 代码提供固定装置。我想出了一个宏,它允许用户定义setup 和teardown 方法。到目前为止,这是我的解决方案: struct FooTest
在宏中使用 ty 时,这几乎适用于我尝试过的所有情况。但是,它似乎不能用于声明新的 struct 实例。 例如:$my_type { some_member: some_value } 一个更全面的例
在一个 API 头文件中我发现了一个奇怪的函数声明: void API_GetParameter(API_SOMESTRUCT param[API_NUM_CONST]); 其中 API_NUM_CO
如何生成一个类,该类采用 Person 实例并将生日作为字符串返回,而不是使用 @MyFormat 注释的值格式化的日期,而无需手动编写该子类? 目的是使用生成的实例来生成 HTML 页面 class
几乎所有文章都说将数据绑定(bind)到 DOM 是不好的。但这到底是什么意思?我该如何避免呢? 最佳答案 通常将应用程序逻辑、数据和数据的展示分离,使应用程序本身更加清晰易维护。通常每个部分都有自己
我正在创建简单的 MultiAutoCompleteTextView 演示。 我看过官方文档MultiAutoCompleteTextView .完成了这个简单的教程。 但这与我想要实现的不同。 我想
我正在尝试修改我的模板文件中的 div 类,特别是 ty-product-list__item-name,以便它显示为 h2 标签。 类在我的模板文件中是这样的 {assign var="
我正在尝试从 opengles 文档中实现我自己的 glOtho 函数 http://www.khronos.org/opengles/documentation/opengles1_0/html/g
JAVA如何格式化日期 4/06/2011 而不是 0 4/06/2011 ? 我需要使用 GregorianCalendar GregorianCalendar today=new Gregoria
我是一名优秀的程序员,十分优秀!