小编mon*_*och的帖子

如何仅在从同一父对象创建对象时才比较对象?

我想Obj只在它们是从同一个Parent对象创建时进行比较,并且它可以工作,但只有一种方法:如果你切换比较顺序,它就不会.

这是最小的代码:

use std::marker::PhantomData;

struct Parent {
    val: u64,
}

impl Parent {
    pub fn new(v: u64) -> Parent {
        Parent { val: v }
    }

    pub fn child(&self, v: u64) -> Child {
        Child {
            val: v,
            phantom: PhantomData,
        }
    }
}

struct Child<'a> {
    val: u64,
    phantom: PhantomData<&'a Parent>,
}

impl<'a> Child<'a> {
    pub fn compare(&'a self, l: &Obj<'a>, r: &Obj<'a>) -> bool {
        l.val == r.val
    }

    pub fn obj(&'a self, v: u64) …
Run Code Online (Sandbox Code Playgroud)

rust

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

对泛型使用更高级别的特征边界

我偶然发现了一个有趣的边缘情况:使用排名较高的生命周期边界来接受返回通用参数的闭包,例如for<'a> FnOnce(&'a T) -> R: MyTrait. 没有办法指定R最多能活多久'a. 也许最好用一个例子来解释。

让我们定义一个简单的类似引用的类型来包装一个值:

struct Source;

struct Ref<'a> {
    source: &'a Source,
    value: i32,
}
Run Code Online (Sandbox Code Playgroud)

为方便起见,让我们添加一个辅助构造函数。在这里,我将使用显式生命周期来使借用不言自明:

impl Source {
    fn new_ref<'a>(&'a self, value: i32) -> Ref<'a> {
        Ref { source: self, value }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个非常奇特的整数复制例程的实现,它使用 HRTB 并在我们的Ref: 上有一个闭包:

fn call_1<F>(callback: F) -> i32
where
    for<'a> F: FnOnce(&'a Source) -> Ref<'a>,
{
    let source = Source;
    callback(&source).value
}

fn fancy_copy_1(value: i32) -> i32 {
    call_1(|s| s.new_ref(value))
} …
Run Code Online (Sandbox Code Playgroud)

lifetime rust

6
推荐指数
0
解决办法
506
查看次数

使用bazel为具有模拟依赖关系的C构建单元测试

我有一个C代码库,我正在尝试用Bazel构建.这个代码库包含单元测试,使用fff库在C中生成函数模拟.实际的库并不重要,但是我对函数模拟的整个概念有问题.

现在我有一个makefile,我链接并运行我的测试.当我构建测试时,我编译并链接测试库和测试源本身.此测试还定义了库依赖项的模拟.链接时,模拟符号会被解析为模拟实现,并且所有内容都按预期工作.但它这样做的原因是我没有链接实际的依赖库,我链接测试源中定义的模拟符号.

主要问题是:我如何使用Bazel做到这一点?当链接cc_test目标的二进制文件时,Bazel compilis并链接所有传递依赖项.由于受测试的库依赖于(via deps)符号的实际实现,因此这个真实的定义与模拟符号并列,我自然会得到这个错误:multiple definition of XXX.

例:

cc_library(
  name = "a",
  # a.cc has the real version of "void some_function()".
  srcs = ["a.cc"],
  hdrs = ["a.h"],
)

# This test is working just fine.
cc_test(
  name = "a_test",
  srcs = ["a_test.cpp"],
  deps = [":a"],
)

cc_library(
  name = "b",
   # b.cc includes a.h and uses "void some_function()".
  srcs = ["b.cc"],
  hdrs = ["b.h"],
  deps = [":a"],
) …
Run Code Online (Sandbox Code Playgroud)

c bazel

5
推荐指数
1
解决办法
347
查看次数

标签 统计

rust ×2

bazel ×1

c ×1

lifetime ×1