我又在和生命搏斗了。或者事实上,我赢得了这场战斗,但我不确定结果是否是预期的处理方式。
假设我有一个有两个生存期的结构:内部
我想出了这个(它有效!)但我有几个问题
struct Inner<'a, 'b>{
foo: &'a str,
bar: &'b str
}
trait Worker<'data, 'a, 'b> {
fn new (inner: &'data Inner<'a, 'b>) -> Self;
fn work_with_inner () { println!("works on inner");}
}
struct SomeWorker<'inner, 'a:'inner, 'b:'inner> {
inner: &'inner Inner<'a, 'b>
}
impl<'data, 'a, 'b> Worker<'data, 'a, 'b> for SomeWorker<'data, 'a, 'b> {
fn new (inner: &'data Inner<'a, 'b>) -> Self {
SomeWorker {
inner: inner
}
}
}
fn main () {
}
游戏Geofence:http://is.gd/A3ol4w
>
就生命周期而言,这可以简化吗?特别是,我想知道这个特征是否真的需要定义所有这些生命周期,或者是否有一种方法只在结构上定义它们?
如果没有办法省略trait上的生命周期,那么这是否意味着为实现者指定trait上所有可能的生命周期是一种最佳实践?我的意思是,如果
SomeWorker
struct不想存储对internal
的引用,那么整个过程,包括trait,可能会简单得多。
看,根本没有生命。
struct Inner<'a, 'b>{
foo: &'a str,
bar: &'b str
}
trait Worker {
fn new (inner: &Inner) -> Self;
fn work_with_inner () { println!("works on inner");}
}
struct SomeWorker;
impl Worker for SomeWorker {
fn new (inner: &Inner) -> Self {
SomeWorker
}
}
fn main () {
}
游戏Geofence:http://is.gd/NzigjX
这就是为什么我要问自己,作为trait的作者,我是否应该假设所有引用的方法最终都会被trait实现者存储在一个字段中,因此我需要指定trait上的所有生命周期,以使实现者能够这样做。
没有一刀切的解决办法。作为一个特质作者,你必须思考你试图做什么,你想实现什么。
如果您希望能够将生命周期值与结构的生命周期参数关联起来,那么必须将生命周期放在trait上。通常会这样做,因为您的trait有多个方法可以在生命周期内对同一个值进行操作。这可能有点像getter/setter对。在我编写的一些代码中,我正在传递
在您的例子中,您有一个构造函数方法,它需要知道结构是否存在生命周期。你可以将这一功能与其他特征区分开来,如果它确实不同的话。在您的示例中,
work\u with_internal
方法不接受self
参数,因此这是非常明显的。如果您使用了self
,但不需要与internal
中的生命周期交互,它仍然可以帮助您:
trait WorkerBuilder<'a, 'b> {
fn new(inner: Inner<'a, 'b>) -> Self;
}
trait Worker {
fn do_work(&self);
}
#[derive(Debug)]
struct Inner<'a, 'b>{
foo: &'a str,
bar: &'b str,
}
// This does track `Inner`
#[derive(Debug)]
struct SomeWorker<'a, 'b>(Inner<'a, 'b>);
impl<'a, 'b> WorkerBuilder<'a, 'b> for SomeWorker<'a, 'b> {
fn new(inner: Inner<'a, 'b>) -> SomeWorker<'a, 'b> {
SomeWorker(inner)
}
}
impl<'a, 'b> Worker for SomeWorker<'a, 'b> {
fn do_work(&self) { println!("Doing work, {:?}", self.0) }
}
// This doesn't track `Inner`
#[derive(Debug)]
struct DumbWorker;
impl<'a, 'b> WorkerBuilder<'a, 'b> for DumbWorker {
fn new(inner: Inner<'a, 'b>) -> DumbWorker {
DumbWorker
}
}
fn main () {}
你会看到我还应用了一件你可以做的事情来减少寿命。如果您的结构只是引用(或引用和其他小
Copy
类型),则无需向该结构传递引用。引用是可复制的,跟踪包含结构的生存期没有用。
编辑-我不觉得“构造函数”方法在一个特性中通常是有用的。您通常希望提供不同的集合或参数,这就是为什么您首先要使用不同的类型。也许您真正的代码在trait中使用的不是构造函数。
问题内容: PMD可以忽略Java源文件中带有注释的特定警告。 Checkstyle有类似的选择吗? 问题答案: 是的,请查看SuppressionCommentFilter和SuppressWithNearbyCommentFilter选项。
我需要向用户显示以下座位并能够预订和取消预订。 我也尝试了unordered_map,但无论我做什么,我都无法使map以我想要的方式显示座位(1A,1B,1C,1D,1E)。 1A 1B 1C 1D 1E 2A 2B 2C 2D 2E... 尝试将座位名称更改为A1 B1 C1 D1...显然,我是C++新手。我知道地图是有序的,并且我知道使用unordered_map无法保证地图的显示方式。 我
简而言之:有没有一种方法可以在gcc或CLANG中不推荐命名空间? 长: 现在我想知道是否有更好的方法来做类似的事情,比如将名称空间util的使用标记为不推荐使用。 我们使用GCC4.7.3作为生产编译器,但是针对clang进行构建和测试,以尝试捕捉gcc的细节;因此,在这些编译器上工作的东西会有所帮助。
我知道一个测试可以通过运行来运行,在sbt中, 有没有办法告诉sbt/scalatest在没有标签的情况下运行单个测试?例如: 这意味着“在类中运行第二个测试。不管它是什么”。我们有一堆测试,没有人费心去标记它们,那么有没有办法在没有标签的情况下运行单个测试?
问题内容: 我正在建立一个带有flask的网站,其中用户具有帐户并能够登录。我正在使用flask-principal作为登录部分和角色管理。有没有办法让用户的会话在5分钟或10分钟后过期?我在flask文档或flask-principal文档中找不到该文件。 我想到了一种手动方法,在登录时在服务器端设置一个带有时间标签的变量,并在用户执行下一个操作时,服务器会验证该时间戳记上的时间增量并删除会话。
问题内容: 在此问题中找到了我能找到的最接近的示例:https : //github.com/tensorflow/tensorflow/issues/899 使用此最小的可复制代码: 但是,返回的FLOPS始终为“无”。有没有一种方法可以具体测量FLOPS,尤其是PB文件? 问题答案: 有点晚了,但也许将来对某些访客有帮助。对于您的示例,我成功测试了以下代码段: 也可以将分析器与以下代码段结合使