我想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) 我偶然发现了一个有趣的边缘情况:使用排名较高的生命周期边界来接受返回通用参数的闭包,例如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) 我有一个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)