- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在努力以一种取悦借用检查员的方式来表达我的代码。
我有一个函数 create_task
这创造了一些数据库操作的 future 。有一个值流,其中每个元素都需要插入到事务中的数据库中。问题是在多个闭包之间共享事务,因为它也可变地借用了连接对象。
#![feature(conservative_impl_trait)]
extern crate futures;
extern crate rusqlite;
use futures::prelude::*;
use futures::{future, stream};
use rusqlite::Connection;
fn main() {
let task = create_task();
task.wait().unwrap();
}
fn create_task() -> impl Future<Item = (), Error = ()> {
let mut conn = Connection::open("temp.db").unwrap();
conn.execute("CREATE TABLE IF NOT EXISTS temp (val INTEGER)", &[]).unwrap();
// tx takes a mut ref to conn!
let tx = conn.transaction().unwrap();
stream::iter_ok::<_, ()>(vec![1, 2, 3])
.for_each(|val| {
// tx borrowed here!
tx.execute("INSERT INTO temp (val) VALUES (?1)", &[&val]).unwrap();
future::ok(())
})
.map(|_| {
// tx moved/consumed here!
tx.commit().unwrap();
})
}
代码存在多个问题:
conn
活得不够长。它也需要移动到闭包。也许作为 Rc<Connection>
因为两次关闭?conn
不能简单地共享为 Rc
因为可变性要求。也许Rc<RefCell<Connection>>
是更合适的类型?tx
在第一个 for_each
之后结束关闭,因此它不能移动到第二个 map
关闭。再次将其移动为 Rc<Transaction>
两个关闭可能是合理的?我一直在摆弄这些想法,并且知道所需的生命周期是可能的并且有意义,但无法以正确的方式向编译器表达我的代码。
最佳答案
我相信您的第一个问题是您还没有完全理解 futures 是多么懒惰。您正在 create_task
中创建一个 Connection
,引用它,将该引用放入流/ future ,然后尝试返回该 future 。 此时甚至还没有执行任何闭包。
你 cannot return a reference to a value created in a function .不要尝试 store the transaction and the connection in the same struct, either .
相反,接受对 Connection
的引用并返回包含该生命周期的 Future
。
下一个问题是编译器不知道如何调用闭包或以什么顺序调用。与其试图关闭交易,不如让它从一个交易“流动”到另一个交易,让所有权系统确保交易始终在正确的位置。
#![feature(conservative_impl_trait)]
extern crate futures;
extern crate rusqlite;
use futures::prelude::*;
use futures::{future, stream};
use rusqlite::Connection;
fn main() {
let mut conn = Connection::open("temp.db").unwrap();
conn.execute("CREATE TABLE IF NOT EXISTS temp (val INTEGER)", &[]).unwrap();
let task = create_task(&mut conn);
task.wait().unwrap();
}
fn create_task<'a>(conn: &'a mut rusqlite::Connection) -> impl Future<Item = (), Error = ()> + 'a {
let tx = conn.transaction().unwrap();
stream::iter_ok::<_, ()>(vec![1, 2, 3])
.fold(tx, |tx, val| {
tx.execute("INSERT INTO temp (val) VALUES (?1)", &[&val]).unwrap();
future::ok(tx)
})
.map(move |tx| {
tx.commit().unwrap();
})
}
一个巨大的警告:如果 execute
不是异步的,你真的不应该在这样的 future 中使用它。任何阻塞操作都会导致你所有的 future 停滞不前。您可能应该在单独的线程/线程池上运行同步工作负载。
另见:
关于stream - 在多个闭包中表达变量对的生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48596087/
我在一个简单的 GTK 应用程序中有两个小部件: extern crate gdk; extern crate gtk; use super::desktop_entry::DesktopEntry;
我想做这样的事情: const vegetableColors = {corn: 'yellow', peas: 'green'}; const {*} = vegetableColors; cons
该属性它存储在 gradle 中的什么位置? subprojects { println it.class.name // DefaultProject_Decorated depen
我想在 jQuery 闭包中看到窗口属性“otherName”描述符。但 进入 jQuery 闭包 'otherName' 描述符显示未定义,我认为可能 是 getOwnPropertyDescrip
我曾经看过 Douglas Crockford 的一次演讲,在 javascript 的上下文中,他提到将 secret 存储在闭包中可能很有用。 我想这可以在 Java 中像这样天真地实现: pub
我很难理解 Swift 中闭包中真正发生的事情,希望有人能帮助我理解。 class MyClass { func printWhatever(words: String) {
我有两个 3 表:用户、个人资料、friend_request $my_profile_id变量存储用户个人资料ID的值 $my_user_id = Auth::user()->id; $my_pro
我正在尝试通过使用 GLFW 的包装来学习 Swift GLFW 允许添加错误回调: GLFWAPI GLFWerrorfun glfwSetErrorCallback(GLFWerrorfun cb
我是一名优秀的程序员,十分优秀!