Can't refer to 'this in generic bounds?
tornewuff opened this issue · 6 comments
use std::io::Read;
struct Foo<R: Read>(R);
struct Bar<'a, R: Read + 'a>(&'a Foo<R>);
#[ouroboros::self_referencing]
struct Test<R: Read + 'this> {
foo: Foo<R>,
#[borrows(foo)]
#[covariant]
bar: Bar<'this, R>,
}
I'm trying to define a selfreferencing structure where the referencing type needs a lifetime on its generic parameter, but adding 'this
doesn't work - it reports it as an undeclared lifetime.
Am I going about this wrong? Is this possible to support?
I needed that too to store an iterator. I've made a workaround with a specific type
pub(super) type EnumeratedDepsLinsIter<'a> = Filter<
Map<Enumerate<Lines<'a>>, fn((usize, &str)) -> (usize, &str)>,
fn(&(usize, &str)) -> bool
>;
and something like this
// The closures are coerced to function pointers so that their types could be named.
//
// Quting the reference, "A closure expression produces a closure value with a unique,
// anonymous type that cannot be written out.".
//
// Source: https://doc.rust-lang.org/reference/types/closure.html
//
// The type of the whole iterator is needed so that ouroboros crate could handle the
// field of the type of the iterator.
let trim_lines: fn((usize, &str)) -> (usize, &str) = |(i, line)| (i, line.trim());
let is_trimmed_dep_line: fn(&(usize, &str)) -> bool = |(_i, line)| line.starts_with(":dep");
but it's ugly.
damn I was looking for this exactly. I needed to store a context and a codegen struct I am making for llvm. since if the context gets dropped it would create an issue for generated modules being invalidated. guess i'll have to look else where.
For anyone interested, I switched to the self_cell
crate in order to work around this issue.
Hi, is there any updates? Thanks!
The primary
difficulty is that the generic parameter is used in places that aren't
self-referencing, such as the Heads struct returned by.into_heads()
.
Then is it possible that, when using Bar<'this>
, the Heads features are disabled? In my scenario (hoping to use this in https://github.com/fzyzcjy/flutter_rust_bridge), I only need to borrow the bar, and no need for functions like into_heads.
EDIT: I realize I do not need this in generics bounds. Thanks for the library and it works!