我在将附加状态传递给我的服务函数时遇到问题,但我无法理清闭包中的生命周期。教程似乎都没有解决这个问题:
https://docs.rs/hyper/0.13.4/hyper/server/index.html
https://docs.rs/hyper/0.13.4/hyper/service/fn.make_service_fn.html
相关代码:
#[tokio::main]
async fn main() {
let addr = ([127, 0, 0, 1], 8080).into();
let db = Arc::new(Mutex::new(Slab::new()));
let server = Server::bind(&addr).serve(make_service_fn(|_conn| async {
let db = db.clone();
Ok::<_, Infallible>(service_fn(move |req| serve_req(req, &db)))
}));
if let Err(e) = server.await {
eprintln!("server error: {}", e)
}
}
Run Code Online (Sandbox Code Playgroud)
错误:
Compiling hyper-microservice v0.1.0 (/data/repos/rust/hyper-microservice)
error[E0495]: cannot infer an appropriate lifetime for borrow expression due to conflicting requirements
--> src/main.rs:121:66
|
121 | Ok::<_, Infallible>(service_fn(move |req| serve_req(req, &db)))
| ^^^ …
Run Code Online (Sandbox Code Playgroud) 如何使用或特征从 a 流式传输hyper::body::Body
到文件。似乎在 0.13.5 中无法创建,因此在如下代码片段中不可能从转换为:tokio::io::AsyncWriteExt
tokio::io::{AsyncRead,AsyncWrite}
hyper::error::Error
std::io::Error
hyper::error::Error
req.into_body().try_fold(file, |file, chunk| async move {
file.write_all(chunk.as_ref()).await.map(|_| file)
});
Run Code Online (Sandbox Code Playgroud)
有没有一种简单的方法可以做到这一点?
摘录Ruby编程语言:
module Functional
def compose(f)
if self.respond_to?(:arity) && self.arity == 1
lambda {|*args| self[f[*args]] }
else
lambda {|*args| self[*f[*args]] }
end
end
alias * compose
end
class Proc; include Functional; end
class Method; include Functional; end
f = lambda {|x| x * 2 }
g = lambda {|x, y| x * y}
(f*g)[2, 3] # => 12
Run Code Online (Sandbox Code Playgroud)
if/else子句中f和*f有什么区别?
出于某种原因,我可以使用IdeaVim来导航我的源文本就好了; 但是,当我跳转到外部库中的java文件(已锁定)时,所有Vim快捷方式都会以某种方式关闭.我怎样才能让他们继续运作?我正在使用Intellij 14 CE.
有人可以解释一下 Haskell 中回文的这个函数是如何工作的:
palindrome :: Eq a => [a] -> Bool
palindrome = reverse >>= (==)
-- type declarations
reverse :: [a] -> [a]
>>= :: Monad m => m a -> (a -> m b) -> m b
(reverse >>=) :: ([a] -> [a] -> b) -> [a] -> b
(==) :: Eq a => a -> a -> Bool
Run Code Online (Sandbox Code Playgroud)
特别是,Monad 类型类在函数上的定义是如何工作的,以及它如何以某种方式将 (==) 的输入数量从两个列表减少到一个列表?
使用serde
和url_serde
板条箱,我收到错误提示我需要满足不相关的特征边界:
Compiling ser v0.1.0 (/data/scratch/ser)
error[E0277]: the trait bound `for<'a> url_serde::Ser<'a, url::Url>: a::_::_serde::Serialize` is not satisfied
--> src/b.rs:4:10
|
4 | #[derive(Serialize, Deserialize)]
| ^^^^^^^^^ the trait `for<'a> a::_::_serde::Serialize` is not implemented for `url_serde::Ser<'a, url::Url>`
|
::: /home/danj/.cargo/registry/src/github.com-1ecc6299db9ec823/url_serde-0.2.0/src/lib.rs:77:46
|
77 | where S: Serializer, for<'a> Ser<'a, T>: Serialize
| --------- required by this bound in `url_serde::serialize`
|
= help: the following implementations were found:
<url_serde::Ser<'a, std::option::Option<url::Url>> as a::_::_serde::Serialize>
<url_serde::Ser<'a, url::Url> as a::_::_serde::Serialize>
<url_serde::Ser<'a, url::host::Host<String>> as a::_::_serde::Serialize> …
Run Code Online (Sandbox Code Playgroud) 当我运行试图初始化对象数组的代码,并且其中一个具有无效值时,它似乎不会调用构造函数,这将设置正确的默认值.下面的代码生成输出:
1
2
1528112104
Run Code Online (Sandbox Code Playgroud)
玩具代码:
#include <iostream>
using namespace std;
class BeeBoop
{
public:
static const int MIN_X = 1;
static const int MAX_X = 2;
BeeBoop(int x);
int getX() { return x; }
bool setX(int x);
private:
int x;
};
int main()
{
BeeBoop boops[] =
{
BeeBoop(1),
BeeBoop(2),
BeeBoop(3)
};
for (int i = 0; i < 3; i++)
cout << boops[i].getX() << endl;
}
BeeBoop::BeeBoop (int x)
{
if(!setX(x))
x = MIN_X;
}
bool BeeBoop::setX(int x)
{ …
Run Code Online (Sandbox Code Playgroud) 我想向 golang 服务器提交一个带有大文件有效负载(最多几个 gbs)的 get 请求,而不是让它将多部分主体存储在文件系统上,然后将文件内容复制到缓冲区并转发它上,我想在请求的正文到达时将其转发到另一个服务(不存储任何内容)。这是一个修改后的(来自How can I receive an Uploaded file using a Golang net/http server?)非工作示例,用于发布请求:
func ReceiveFile(w http.ResponseWriter, r *http.Request) {
var Buf bytes.Buffer
file, header, err := r.FormFile("file")
if err != nil {
panic(err)
}
defer file.Close()
io.Copy(&Buf, file)
// stream Buf to grpc server
Buf.Reset()
return
}
Run Code Online (Sandbox Code Playgroud) 在 golang 中管理资源所有权的正确方法是什么?假设我有以下内容:
db, err := sql.Open("mysql", "role@/test_db")
am := NewResourceManager(db)
am.DoWork()
db.Close()
Run Code Online (Sandbox Code Playgroud)
总是让调用函数维护关闭资源的所有权和责任是典型的吗?这对我来说感觉有点奇怪,因为在关闭后,am
仍然保留一个引用,db
如果我或其他人稍后不小心,可以尝试使用(我想这是延迟的情况;但是,如果我想将 ResourceManager 传am
回从这个块,我什至如何正确推迟文件的关闭?我实际上希望它在这个块完成执行时保持打开状态)。我发现在其他语言中,我经常希望允许实例管理资源,然后在调用析构函数时将其清理干净,就像这个玩具 python 示例:
class Writer():
def __init__(self, filename):
self.f = open(filename, 'w+')
def __del__(self):
self.f.close()
def write(value):
self.f.write(value)
Run Code Online (Sandbox Code Playgroud)
不幸的是,golang 中没有析构函数。除了这样的事情,我不知道我会如何在 go 中做到这一点:
type ResourceManager interface {
DoWork()
// Close() ?
}
type resourceManager struct {
db *sql.DB
}
func NewResourceManager(db *sql.DB) ResourceManager {
return &resourceManager{db}
}
db, err := sql.Open("mysql", "role@/test_db")
am := NewResourceManager(db)
am.DoWork()
am.Close() // using method …
Run Code Online (Sandbox Code Playgroud)