Closed
Description
I'm trying to binding my API to Lua, but I have meet troubles when binding iterator, this is a minimual test for that:
fn test_iter() -> LuaResult<()> {
use std::collections::BTreeSet;
let lua = Lua::new();
#[derive(Default)]
struct MySet(BTreeSet<i32>);
impl Deref for MySet {
type Target = BTreeSet<i32>;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl DerefMut for MySet {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.0
}
}
struct MyIter<'a>(std::collections::btree_set::Iter<'a, i32>);
impl<'a> Iterator for MyIter<'a> {
type Item = i32;
fn next(&mut self) -> Option<Self::Item> {
self.0.next().cloned()
}
}
impl<'a> LuaUserData for MyIter<'a> {
fn add_methods<'lua, M: LuaUserDataMethods<'lua, Self>>(methods: &mut M) {
methods.add_meta_method_mut(LuaMetaMethod::Call, |_, iter, ()| Ok(iter.next()));
}
}
impl LuaUserData for MySet {
fn add_methods<'lua, M: LuaUserDataMethods<'lua, Self>>(methods: &mut M) {
methods.add_method("iter", |lua, set, ()| {
let iter = MyIter::<'lua>(set.iter());
Ok(LuaValue::UserData(lua.create_userdata(iter)?)) // <--- error here
});
}
}
let mut set = MySet::default();
set.insert(1);
set.insert(2);
set.insert(3);
lua.globals().set("set", set)?;
lua.load(
r#"
print(set)
for v in set:iter() do
print(v)
end
"#,
)
.exec()
}
it errors:
error[E0521]: borrowed data escapes outside of closure
--> main.rs:57:39
|
55 | methods.add_method("iter", |lua, set, ()| {
| ---
| |
| `set` is a reference that is only valid in the closure body
| has type `&'1 MySet`
56 | let iter = MyIter::<'lua>(set.iter());
57 | Ok(LuaValue::UserData(lua.create_userdata(iter)?))
| ^^^^^^^^^^^^^^^^^^^^^^^^^
| |
| `set` escapes the closure body here
| argument requires that `'1` must outlive `'static`
error: lifetime may not live long enough
--> main.rs:57:39
|
54 | fn add_methods<'lua, M: LuaUserDataMethods<'lua, Self>>(methods: &mut M) {
| ---- lifetime `'lua` defined here
...
57 | Ok(LuaValue::UserData(lua.create_userdata(iter)?))
| ^^^^^^^^^^^^^^^^^^^^^^^^^ argument requires that `'lua` must outlive `'static`
For more information about this error, try `rustc --explain E0521`.
So how could I deal with it?
Metadata
Metadata
Assignees
Labels
No labels